比较二叉树的节点

时间:2009-06-15 02:00:54

标签: c algorithm tree binary-tree

如果我有两个二叉树,我如何检查所有节点中的元素是否相等。

关于如何解决这个问题的任何想法?

9 个答案:

答案 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);  
}