protected GTreeNode findNode(GTreeNode parent, SymbolNode key, boolean loadChildren,
			TaskMonitor monitor) {

		if ((!isLoaded() && !loadChildren) || monitor.isCancelled()) {
			return null;
		}

		// see if the given node is the node we want
		Symbol searchSymbol = key.getSymbol();
		if (parent instanceof SymbolTreeNode symbolNode) {
			if (symbolNode.getSymbol() == searchSymbol) {
				return symbolNode;
			}
		}

		Comparator<GTreeNode> comparator = ((SymbolTreeNode) parent).getChildrenComparator();
		List<GTreeNode> children = parent.getChildren();
		int index = Collections.binarySearch(children, key, comparator);
		if (index >= 0) {
			GTreeNode node = children.get(index);
			SymbolTreeNode symbolNode = (SymbolTreeNode) node;

			// Some parent nodes may contain OrganizationNodes, which will return as a match when 
			// the symbol does not match.  We expect the symbol to always match for clients of this 
			// method.  
			if (symbolNode.getSymbol() == searchSymbol) {
				return symbolNode;
			}
		}

		return null;

	}
Searches for the given node 'key' inside of the given parent.   This method performs an 
efficient search and does not recurse below the given node.

@param parent the node whose children will be searched
@param key the token node to search for
@param loadChildren true to load children; false signals to search only if already loaded
@param monitor the monitor
@return the node or null
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/nodes/SymbolTreeNode.java