private long createTree(Listing listing, String treeName, ProgramModule sourceRoot) {

		ArrayList<String> fragmentNameList = new ArrayList<String>();
		try {
			ProgramModule root = listing.createRootModule(treeName);
			// get a fragment for each memory block when a tree is created;
			// rename these fragments so we can remove them after 
			// we populate the tree
			Group[] kids = root.getChildren();
			String[] names = new String[kids.length];
			for (int i = 0; i < kids.length; i++) {
				names[i] = kids[i].getName() + "__default__" + i;
				kids[i].setName(names[i]);
			}
			createModules(root, sourceRoot, fragmentNameList);
			removeEmptyFragments(root, fragmentNameList);

			// remove the fragments that were created by default
			for (String name : names) {
				root.removeChild(name);
			}
			return root.getTreeID();
		}
		catch (DuplicateNameException e) {
			throw new AssertException("Got duplicate name while creating tree " + treeName);
		}
		catch (NotEmptyException e) {
			throw new AssertException("Got Not empty exception");
		}
	}
Called when we need to know which tree changed (not enough to know
that the structures are different).
@param root1 root of the original program 
@param root2 root for either the source tree or the destination tree
@return true if there was no original root, OR the modification
numbers for the original tree and tree containing root do not match
Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/ProgramTreeMergeManager.java