繁体   English   中英

比较二叉树的节点

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM