【问题标题】:Difference between binary tree and binary search tree二叉树和二叉搜索树的区别
【发布时间】:2011-09-16 20:06:26
【问题描述】:

谁能解释一下二叉树二叉搜索树的区别用一个例子

【问题讨论】:

    标签: data-structures tree binary-tree binary-search-tree


    【解决方案1】:

    二叉树:每个节点最多有两个叶子的树

      1
     / \
    2   3
    

    二叉搜索树:用于搜索。一棵二叉树,其中左子节点 only 包含值小于父节点的节点,而右子节点 only 包含值大于或等于父节点的节点。

      2
     / \
    1   3
    

    【讨论】:

    • @pete:这是一个概念性的东西,你不一定会真正制作一个完全不受约束的东西。但是,有很多非搜索二叉树在其他方面是特殊的,例如二进制堆。
    • @pete 二叉树不一定必须包含可比较的数据,许多(非搜索)二叉树用于解析代数表达式,二叉树非常适合编写中缀符号解析器,通过放置运算符作为节点和数值作为叶子
    • @JBoy:在这种情况下,它们不会是二叉树。 (例如,一元运算符不能有两个孩子。)我真的想不出无约束二叉树的实际用例,这就是我发表评论的原因。
    • 伟大而简单。 +1 视觉示例 :)
    • @Vroomfondel:你特别想到什么样的树?我猜它们可能是用于搜索的二叉树,但我认为“二叉搜索树”一词专门指那些遵守排序标准的树……至少/尤其是在介绍性计算机科学中。 (虽然我不会真正称它为“本地”,因为它适用于整个左右子树?)
    【解决方案2】:

    Binary Tree 是具有两个孩子(左孩子和右孩子)的树的特殊形式。 它只是树结构中的数据表示

    Binary Search Tree (BST) 是一种特殊类型的二叉树,满足以下条件:

    1. 左子节点小于其父节点
    2. 右子节点大于其父节点

    【讨论】:

    • 这些条件是不够的。整个左子树必须不包含任何键,并且只包含小于父节点的键,并且整个右子树必须包含更大的节点。
    • @EJP 你能详细说明你的评论吗?整个子树是什么意思?你的意思是子树的所有值都应该小于左侧的根?并且所有值都应该大于右侧的根值?
    • 按照第二个链接,阅读“验证”部分,就会清楚。
    【解决方案3】:

    二叉树由节点组成,其中每个节点包含一个“左”指针、一个“右”指针和一个数据元素。 “根”指针指向树中最顶层的节点。左右指针递归地指向两侧较小的“子树”。空指针表示没有元素的二叉树——空树。正式的递归定义是:二叉树要么是空的(用空指针表示),要么由单个节点组成,其中左右指针(前面的递归定义)都指向一棵二叉树。

    二叉搜索树(BST)或“有序二叉树”是一种二叉树,其中节点按顺序排列:对于每个节点,其左子树中的所有元素都小于节点()。

        5
       / \
      3   6 
     / \   \
    1   4   9    
    

    上面显示的树是一个二叉搜索树——“根”节点是一个5,它的左子树节点(1,3,4)是 5.递归地,每个子树也必须服从二叉搜索树约束:在(1,3,4)子树中,3是根,13。

    注意问题中的确切措辞——“二叉搜索树”不同于“二叉树”。

    【讨论】:

    • @GabrielStaples 添加了树结构。
    【解决方案4】:

    上面已经解释了二叉树和二叉搜索树的区别,我只是添加如何测试给定的二叉树是否是二叉搜索树。

    boolean b = new Sample().isBinarySearchTree(n1, Integer.MIN_VALUE, Integer.MAX_VALUE);
    .......
    .......
    .......
    public boolean isBinarySearchTree(TreeNode node, int min, int max)
    {
    
        if(node == null)
        {
            return true;
        }
    
        boolean left = isBinarySearchTree(node.getLeft(), min, node.getValue());
        boolean right = isBinarySearchTree(node.getRight(), node.getValue(), max);
    
        return left && right && (node.getValue()<max) && (node.getValue()>=min);
    
    }
    

    希望对您有所帮助。对不起,如果我转移话题,因为我觉得这里值得一提。

    【讨论】:

    • 左子树或右子树都可以为空。您的代码没有正确处理这种情况。
    • @user207421 还有一些二叉搜索树不遵守本地排序标准,仍然是二叉搜索树(具有最优性和所有特性)。
    【解决方案5】:

    二叉树代表数据结构,它由节点组成,只能拥有两个孩子参考。

    二叉搜索树BST)是一种特殊形式的二叉树数据结构,其中每个节点 具有可比较的值,较小值的子项依附于左侧,较大的值子项依附于右侧。

    因此,所有 BST 都是 二叉树,但只有一些 二叉树 可能也是 BST。通知 BST二叉树 的子集。

    因此,二叉树二叉搜索树更像是一种通用的数据结构。您还必须通知 Binary Search Treesorted 树,而通用 Binary Tree 没有这样的规则集。 p>

    二叉树

    Binary Tree不是BST

             5
           /   \
          /     \
         9       2
        / \     / \
      15   17  19  21
    

    二叉搜索树(排序树)

    一个二叉搜索树,它也是一个二叉树

             50
           /    \
          /      \
         25      75
        /  \    /  \
      20    30 70   80
    

    二叉搜索树节点属性

    同时通知 BST 中的任何 父节点

    • 所有左节点的值都小于父节点的值。在上例中,值为 {20, 25, 30 } 的节点都位于左侧左后代)为 50,小于 50。

    • 所有右节点的值都大于父节点的值。在上面的示例中,具有值 { 70, 75, 80 } 的节点都位于 50 的右侧右后代)大于 50。

    二叉树节点没有这样的规则。 二叉树节点的唯一规则是有两个孩子,所以它自己解释为什么叫二叉树

    【讨论】:

    • 我们可以实现简单二叉树吗?有没有可用的实现?这棵树有什么用?
    • @UnKnown 您可以使用二叉搜索树进行排序和搜索。你可以在这里找到二叉搜索树的实现:github.com/bzdgn/data-structures-in-java/blob/master/src/…
    • 我知道但是有没有简单树或简单二叉树的存在?或任何简单二叉树的实现?
    • 没有必要使用它,但您可以将任意 Node 实例添加到根和子节点。
    【解决方案6】:

    二叉搜索树是一种特殊的二叉树,它具有以下性质:对于任意节点n,n的左子树中的每个后代节点的值都小于n的值,并且n的每个后代节点的值都小于n的值。右子树大于n的值。

    【讨论】:

      【解决方案7】:

      二叉树

      二叉树可以是任何东西,它有 2 个子节点和 1 个父节点。它可以实现为链表或数组,也可以使用您的自定义 API。一旦您开始向其中添加更具体的规则,它就会变得更加专业树。最常见的已知实现是,在左侧添加较小的节点,在右侧添加较大的节点。

      例如,一棵大小为 9、高度为 3 的标记二叉树,其根节点的值为 2。树不平衡且未排序https://en.wikipedia.org/wiki/Binary_tree

      例如,在左边的树中,A 有 6 个孩子 {B,C,D,E,F,G}。可以转化为右边的二叉树。

      二分搜索

      二分搜索是一种用于在节点链上查找特定项目的技术/算法。 二进制搜索适用于已排序的数组

      二分查找将目标值与数组的中间元素进行比较;如果它们不相等,则消除目标不能位于的一半,并继续搜索剩余的一半,直到成功或剩余的一半为空。 https://en.wikipedia.org/wiki/Binary_search_algorithm

      表示二分搜索的树。这里要搜索的数组是[20, 30, 40, 50, 90, 100],目标值为40。

      二叉搜索树

      这是二叉树的实现之一。这专门用于搜索

      二叉搜索树和B-tree数据结构基于二叉搜索

      二叉搜索树 (BST),有时称为有序或排序二叉树,是一种特定类型的容器:将“项目”(例如数字、名称等)存储在内存中的数据结构. https://en.wikipedia.org/wiki/Binary_search_tree

      大小为 9、深度为 3 的二叉搜索树,根为 8。叶子没有画出来。

      最后是用于比较知名数据结构和应用算法的性能的绝佳架构:

      图片取自Algorithms (4th Edition)

      【讨论】:

        【解决方案8】:
        • 二叉搜索树:在二叉树上进行中序遍历时,您会得到插入项的排序值
        • 二叉树:在任何类型的遍历中都找不到排序顺序

        【讨论】:

        • 找不到排序顺序需要。二叉搜索树也是二叉树。它们不是相互排斥的。 BST 是 BT 的真子集。
        • 对,如果你仔细阅读,这就是为什么二叉搜索树解释有 - 当在*二叉树上进行中序遍历时*
        【解决方案9】:

        二叉树是一棵树,其子节点不超过两个。二叉搜索树遵循左子节点的值应小于根节点的键值,而右子节点的值应大于根节点的键值的不变性。

        【讨论】:

          【解决方案10】:

          要检查给定的二叉树是否是二叉搜索树,这是一种替代方法。

          Inorder Fashion中的遍历树(即左子->父->右子), 将遍历的节点数据存储在临时变量中让我们说 temp,就在存储到 temp 之前,检查当前节点的数据是否高于前一个。 然后只需 break 它,Tree 不是 Binary Search Tree 否则遍历直到结束。

          以下是 Java 示例:

          public static boolean isBinarySearchTree(Tree root)
          {
              if(root==null)
                  return false;
          
              isBinarySearchTree(root.left);
              if(tree.data<temp)
                  return false;
              else
                  temp=tree.data;
              isBinarySearchTree(root.right);
              return true;
          }
          

          在外部维护临时变量

          【讨论】:

          • 任何一个子树都可以为空。您的算法无法正确处理这种情况。
          【解决方案11】:

          在二叉搜索树中,所有节点都按特定顺序排列 - 根节点左侧的节点的值小于其根,节点右侧的所有节点的值都大于根的值。

          【讨论】:

            【解决方案12】:

            当且仅当任何节点的最大子节点数为两个时,树才能称为二叉树。

            当且仅当任何节点的最大子节点数为两个并且左子节点总是小于右子节点时,树才能称为二叉搜索树。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-08
              • 2010-09-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多