数据结构.二叉树和二叉搜索树的区别

fzwojiic  于 2021-07-03  发布在  Java
关注(0)|答案(12)|浏览(477)

有人能用一个例子来解释二叉树和二叉搜索树的区别吗?

t9aqgxwy

t9aqgxwy1#

二叉树是有两个子树(左子树和右子树)的一种特殊形式。它只是简单地用树结构表示数据
二叉搜索树(bst)是一种特殊类型的二叉树,符合以下条件:
左侧子节点小于其父节点
右子节点大于其父节点

shyt4zoc

shyt4zoc2#

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

xqnpmsa8

xqnpmsa83#

当且仅当任一节点的子节点的最大数目为2时,树才能被称为二叉树。
当且仅当任意节点的最大子节点数为2且左子节点总是小于右子节点时,树才可以称为二叉搜索树。

3b6akqbq

3b6akqbq4#

二叉树
二叉树可以是任何有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-树数据结构是基于二叉搜索的。
二叉搜索树(bst),有时称为有序或排序二叉树,是一种特殊类型的容器:在内存中存储“项”(如数字、名称等)的数据结构。https://en.wikipedia.org/wiki/binary_search_tree
大小为9,深度为3,根为8的二叉搜索树。叶子没有画出来。

最后是用于比较已知数据结构和算法性能的最佳模式:

图像取自算法(第4版)

kyxcudwk

kyxcudwk5#

二叉树由节点组成,每个节点包含一个“左”指针、“右”指针和一个数据元素。“根”指针指向树中最顶层的节点。左指针和右指针递归地指向两边较小的“子树”。空指针表示没有元素的二叉树——空树。正式的递归定义是:二叉树要么是空的(由空指针表示),要么是由单个节点组成的,其中左指针和右指针(前面的递归定义)每个指向一个二叉树。
二叉搜索树(bst)或“有序二叉树”是一种按顺序排列节点的二叉树:对于每个节点,其左子树中的所有元素小于节点(<),其右子树中的所有元素大于节点(>)。

5
   / \
  3   6 
 / \   \
1   4   9

上面显示的树是一个二叉搜索树,“根”节点是一个5,它的左子树节点(1,3,4)小于5,右子树节点(6,9)大于5。递归地,每个子树也必须服从二叉搜索树约束:在(1,3,4)子树中,3是根,1<3和4>3。
注意问题的确切措辞——“二叉搜索树”不同于“二叉树”。

nnvyjq4y

nnvyjq4y6#

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

35g0bw71

35g0bw717#

二叉树代表一种数据结构,它由只能有两个子引用的节点组成。
另一方面,二叉搜索树(binarysearchtree,bst)是一种特殊形式的二叉树数据结构,其中每个节点都有一个可比较的值,较小值的子节点依附在左边,较大值的子节点依附在右边。
因此,所有的bst都是二叉树,但是只有一些二叉树也可能是bst。通知bst是二叉树的子集。
因此,二叉树比二叉搜索树更像是一种通用的数据结构。另外,您还必须通知二叉搜索树是一个排序树,而通用二叉树没有这样的规则集。

二叉树

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。
二叉树节点没有这样的规则。二叉树节点的唯一规则是有两个子节点,所以它自己解释了为什么称为二进制。

p8ekf7hl

p8ekf7hl8#

二叉搜索树:在二叉树上进行有序遍历时,可以得到插入项的排序值
二叉树:在任何类型的遍历中都找不到排序顺序

9avjhtql

9avjhtql9#

要检查给定的二叉树是否是二叉搜索树,这里有另一种方法。
按顺序遍历树(即左子节点-->父节点-->右子节点),将遍历的节点数据存储在临时变量temp中,在存储到temp之前,检查当前节点的数据是否高于上一个节点的数据。然后就把它拆开,树不是二叉搜索树否则遍历到底。
下面是一个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;
}

保持外部温度变量

gz5pxeao

gz5pxeao10#

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

ghg1uchk

ghg1uchk11#

正如上面每个人都解释了二叉树和二叉搜索树之间的区别,我只是添加了如何测试给定的二叉树是否是二叉搜索树。

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);

}

希望对你有帮助。抱歉,如果我从这个主题转移,因为我觉得这是值得一提的。

igsr9ssn

igsr9ssn12#

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

1
 / \
2   3

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

2
 / \
1   3

相关问题