[英]compare nodes of a binary tree
如果我有两棵二叉树,我将如何检查所有节点中的元素是否相等。
关于如何解决这个问题的任何想法?
您将进行并行树遍历 - 选择您的订单(预购、后购、有序)。 如果在任何时候存储在当前节点中的值不同,那么两棵树也是如此。 如果一个左节点为空而另一个不是,则树是不同的; 同样适用于正确的节点。
节点顺序重要吗? 对于这个答案,我假设以下两棵树:
1 1
/ \ / \
3 2 2 3
不相等,因为比较时考虑了节点位置和顺序。
一些提示
更精确一点
考虑这个通用树:
rootnode(value=V)
/ \
/ \
-------- -------
| left | | right |
| subtree| |subtree|
-------- -------
rootnode是单个节点。 这两个孩子更通用,代表二叉树。 子节点可以是空的,也可以是单个节点,也可以是成熟的二叉树。
您是否同意这种表示足够通用以表示任何类型的非空二叉树? 你能把这个简单的树分解成我的表示吗?
如果你理解了这个概念,那么这个分解可以帮助你解决问题。 如果您确实理解了这个概念,但无法进一步了解该算法,请在此处发表评论,我会更具体一点:)
您可以使用Tree Traversal 之类的东西来检查每个值。
让两棵树通过相同的树遍历逻辑并匹配输出。 如果即使单个节点数据不匹配,树也不匹配。
或者您可以创建一个简单的树遍历逻辑并在每次递归时比较节点值。
您可以使用指针和递归来检查节点是否相等,然后检查子树。 代码可以用Java语言编写如下。
public boolean sameTree(Node root1, Node root2){
//base case :both are empty
if(root1==null && root2==null )
return true;
if(root1.equals(root2)) {
//subtrees
boolean left=sameTree(root1.left,root2.left);
boolean right=sameTree(root1.right,root2.right);
return (left && right);
}//end if
else{
return false;
}//end else
}//结束sameTree()
编写 C 代码作为问题中提到的标签。
int is_same(node* T1,node* T2)
{
if(!T1 && !T2)
return 1;
if(!T1 || !T2)
return 0;
if(T1->data == T2->data)
{
int left = is_same(T1->left,T2->left);
int right = is_same(T1->right,T2->right);
return (left && right);
}
else
return 0;
}
兼顾结构和价值观。
一行代码足以检查两个二叉树节点是否相等(相同的值和相同的结构)。
bool isEqual(BinaryTreeNode *a, BinaryTreeNode *b)
{
return (a && b) ? (a->m_nValue==b->m_nValue && isEqual(a->m_pLeft,b->m_pLeft) && isEqual(a->m_pRight,b->m_pRight)) : (a == b);
}
如果树是二叉搜索树,那么前序遍历将产生可靠的、可重复的项目排序,则现有答案将起作用。 如果它们是任意二叉树,那么您将遇到一个更有趣的问题,并且应该查看哈希表。
我的解决方案是将两棵树展平为 2 个数组(使用级别顺序),然后遍历每个项目并进行比较。 您知道两个数组的顺序相同。 您可以进行简单的预检查,例如如果数组大小不同,那么两棵树就不一样。
级别顺序相当容易实现,关于树遍历的 Wikipedia 文章基本上为您提供了所需的一切,包括代码。 如果问题中要求效率,那么最好使用非递归解决方案,并使用 FIFO 列表(C# 用语中的队列 - 我不是 C 程序员)来完成。
如果您的值是整数 int,在已知范围内,您可以使用数组(假设最大值n
)。 使用您想要的任何方法遍历第一棵树,将数据添加到所述数组中,在适当的索引中(使用节点数据作为索引)。 然后,遍历第二棵树并检查其中的每个节点,如果array[node.data]
不为空。 如果不是 - 树是相同的。 **假设每棵树的所有节点都是唯一的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.