有人能举例说明二叉树和二叉搜索树的区别吗?


当前回答

二叉树

二叉树可以是任何有两个子结点和一个父结点的树。它可以实现为链表或数组,或与您的自定义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版)》

其他回答

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

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

}

希望对你有所帮助。抱歉,如果我转移了话题,因为我觉得这里值得一提。

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

按顺序遍历树(即左子->父->右子), 在临时变量中存储遍历的节点数据,比如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;
}

保持室外温度变量

二叉树表示一种数据结构,它由只能有两个子引用的节点组成。

另一方面,二叉搜索树(BST)是一种特殊形式的二叉树数据结构,其中每个节点都有一个可比较的值,较小的值子连接到左边,较大的值子连接到右边。

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

因此,二叉树比二叉搜索树更像是一种通用的数据结构。你还需要知道二叉搜索树是一棵排序树而一般的二叉树没有这样的规则。

二叉树

二叉树不是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。

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

A binary tree is made of nodes, where each node contains a "left" pointer, a "right" pointer, and a data element. The "root" pointer points to the topmost node in the tree. The left and right pointers recursively point to smaller "subtrees" on either side. A null pointer represents a binary tree with no elements -- the empty tree. The formal recursive definition is: a binary tree is either empty (represented by a null pointer), or is made of a single node, where the left and right pointers (recursive definition ahead) each point to a binary tree.

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

    5
   / \
  3   6 
 / \   \
1   4   9    

上面所示的树是一棵二叉搜索树——“根”节点为5,其左子树节点(1,3,4)< 5,右子树节点(6,9)为> 5。递归地,每个子树也必须服从二叉搜索树约束:在(1,3,4)子树中,3是根,1 < 3和4 > 3。

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

二叉树是一种子树的数目永远不超过两个。二叉搜索树遵循一个不变式,即左子节点的值应该小于根节点的键,而右子节点的值应该大于根节点的键。