如果我有两个二叉树,我如何检查所有节点中的元素是否相等。
关于如何解决这个问题的任何想法?
答案 0 :(得分:7)
您将进行并行树遍历 - 选择您的订单(预订,订购后,按顺序)。如果存储在当前节点中的值在任何时候都不同,那么两棵树也是如此。如果一个左节点为空而另一个不是,则树是不同的;同意正确的节点。
答案 1 :(得分:2)
节点顺序是否重要?我假设这个答案是以下两棵树:
1 1
/ \ / \
3 2 2 3
不相等,因为比较时会考虑节点位置和顺序。
一些提示
更准确一点
考虑这个通用树:
rootnode(value=V)
/ \
/ \
-------- -------
| left | | right |
| subtree| |subtree|
-------- -------
rootnode 是单个节点。这两个孩子更通用,代表二叉树。子项可以是空的,也可以是单个节点,也可以是完全成长的二叉树。
你是否同意这种表示足以表示任何类型的非空二叉树?您是否能够将this simple tree分解为我的代表?
如果您理解这个概念,那么这种分解可以帮助您解决问题。如果您确实理解了这个概念,但无法继续使用该算法,请在这里发表评论,我会更具体一点:)
答案 2 :(得分:1)
您可以使用类似Tree Traversal的内容来检查每个值。
答案 3 :(得分:0)
如果树是二进制搜索树,那么预订步行将产生可靠,可重复的项目排序,现有答案将起作用。如果它们是任意的二叉树,那么你会遇到一个更有趣的问题,应该研究hash tables。
答案 4 :(得分:0)
我的解决方案是将两棵树压平成2个数组(使用级别顺序),然后遍历每个项目并进行比较。你知道两个数组都是相同的顺序。您可以进行简单的预检查,例如,如果数组大小不同,那么两棵树就不一样了。
Level Order非常容易实现,tree traversal上的维基百科文章基本上为您提供了所需的一切,包括代码。如果在问题中要求效率,那么非递归解决方案是最好的,并且使用FIFO列表完成(C#中的队列用语 - 我不是C程序员)。
答案 5 :(得分:0)
让两棵树通过相同的树遍历逻辑并匹配输出。如果即使单个节点数据与树匹配也不匹配。
或者您可以创建一个简单的树遍历逻辑并比较每次递归时的节点值。
答案 6 :(得分:0)
您可以使用指针和递归来检查节点是否相等,然后检查子树。代码可以用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()
答案 7 :(得分:0)
在问题中提及将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;
}
关注结构和价值观。
答案 8 :(得分: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);
}