private ParentageNode findNode(ClassID owner, List<ClassID> parentage, ParentageNode root) {
		SymbolPath ownerSp = owner.getSymbolPath();
		ParentageNode ownerNode = root.getBranch(ownerSp.toString());
		if (ownerNode == null) {
			return null;
		}
		ParentageNode resultNode = null;
		ParentageNode node = ownerNode;
		for (ClassID id : parentage) {
			SymbolPath sp = id.getSymbolPath();
			ParentageNode next = node.getBranch(sp.toString());
			if (next != null) {
				node = next;
				resultNode = node;
			}
			// Regardless of found or not, go to next in parentage.
			//  Skips unnecessary peer-through parents
		}
		if (resultNode == null) {
			return ownerNode;
		}
		// Need to have found at least one in parentage, but since the owner is part of our
		//  parentage tree, we cannot use the fact that we are still on owner (which can also
		//  be in our parentage list) as the flag for knowing if we found something in the
		//  parentage, so we have a separate found flag
		return resultNode;
	}
Creates a virtual function or base table for the mangled symbol and its associated
memory address

@param categoryPath the base category path used for the collection of class-related
types
@param mangled the mangled name of the type
@param address the address associated with the mangled name
@param monitor the task monitor
@return {@code true} if successful
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/classtype/MsVxtManager.java