举个例子,假设我有两棵树:一个是文件夹结构,另一个是内存中该文件夹结构的“模型”。我希望比较这两棵树,并生成一棵树中存在的节点列表,而不是另一棵 - 反之亦然。
有一个公认的算法来处理这个问题吗?
本质上,你只是想做一个遍历。在哪里“visiting”一个节点意味着检查一个版本但不是另一个版本的孩子。
更确切地说:从根开始
。在每个节点上,获取节点的两个版本中的每一个中的一组项目。两组的对称差异包含一个项目,但不包含其他项目。输出这些。交叉点包含两者共有的项目。对于交叉点中的每个项目(我假设你不打算深入查看一棵树中缺少的项目),请在该节点上递归调用“visit”以检查其内容。
public boolean compareTrees(TreeNode root1, TreeNode root2) {
if ((root1 == null && root2 != null) ||
(root1 != null && root2 == null)) {
return false;
}
if (root1 == null && root2 == null) {
return true;
}
if (root1.data != root2.data) {
return false;
}
return compareTrees(root1.left, root2.left) &&
compareTrees(root1.right, root2.right);
}