请问有人能用一个例子解释二叉树和二叉搜索树的区别吗?
二叉树:每个节点最多有两个子节点的树
1
/ \
2 3
二叉搜索树:用于查找。它是一棵二叉树,其中左子节点只包含值小于父节点的节点,右子节点则只包含值大于等于父节点的节点。
2
/ \
1 3
二叉树由节点组成,每个节点包含一个“左”指针、一个“右”指针和一个数据元素。 “根”指针指向树中最顶部的节点。左右指针递归地指向两侧较小的“子树”。空指针表示没有元素的二叉树 - 空树。正式的递归定义是:二叉树要么为空(用null指针表示),要么由一个单独的节点组成,其中左右指针(递归定义在前面)分别指向二叉树。
二叉搜索树(BST)或“有序二叉树”是一种二叉树类型,其中节点按顺序排列:对于每个节点,其左子树中的所有元素都小于该节点(<),而其右子树中的所有元素都大于该节点(>)。
5
/ \
3 6
/ \ \
1 4 9
上面展示的树是一棵二叉搜索树——"根"节点是5,其左子树节点(1、3、4)< 5,右子树节点(6、9)> 5。递归地讲,每个子树都必须遵守二叉搜索树的约束条件:在(1、3、4)子树中,3是根节点,1<3且4>3。正如其他人已经解释了二叉树和二叉搜索树之间的区别,我只是补充说明如何测试给定的二叉树是否为二叉搜索树。
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);
}
二叉树是一种由节点组成的数据结构,每个节点只能有两个子节点。
二叉搜索树(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。
对于二叉树节点没有此规则。二叉树节点仅有的规则是具有两个孩子节点,因此自我解释为什么称为二叉。
二叉树
二叉树可以是任何具有2个子节点和1个父节点的东西。它可以实现为链表或数组,或使用您的自定义API。一旦您开始将更具体的规则添加到其中,它就变成了更加专业化的树。最常见的已知实现是在左侧添加较小的节点,并在右侧添加较大的节点。
例如,一个带有值为2的根节点、大小为9且高度为3的有标签二叉树。此树不平衡且未排序。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版)》
二叉树是一种子节点不超过两个的树结构。二叉搜索树遵循以下规则:左子节点的键值应小于根节点的键值,而右子节点的键值应大于根节点的键值。
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;
}
将临时变量放在外部进行维护