《算法神探》之:二叉搜索树

二:二叉搜索树

1、树中的每一个节点存放一个值,并且在每个节点最多有两个子节点:一个左子节点和一个右子节点,节点的位置根据其中存放的值的大小来决定,所有左子节点和它的左子节点中存放的值都比当前节点中的值小;类似的,所有右子节点和它的右子节点中存放的值都比当前节点的值大。

如果对于每个节点,其左子树中的节点的数目都和其右子树中的节点数目一致,此二叉树是完全平衡的。在此情况下,如果将树中的节点数量翻倍,整棵树的高度只会增加1。

在二叉搜索树中查找一值,可以从最上面的节点(根节点)往下查找,每查找一步就比较要找的值和当前节点的值的大小,以决定向左查找还是向右查找。

2、从一个排好序的数组中创建出一棵二叉搜索树,只需要不断递归将所有元素划分成更小的集合,在每一层中,选择最中间的那个元素作为那一层的节点,如果元素个数为偶数,那么随意选择中间的两个元素中的一个就行。

创建好一个根节点之后可以用同样的方式来分割右边的元素和左边的元素。

实际建造这棵树的时候,不需要真正去分割或者复制这个数组,整个算法可以只使用一个数组,我们只需要记录好当前分支中最小和最大元素的下标编号就好了。

3、在二叉搜索树上进行区间查找和查找一个区间类似。算法从最顶端的根节点开始,一路递归着搜索整棵树:

①如果当前节点在要找的区间内,应将其加到结果列表中

②如果当前节点有左子树,并且当前节点的值大于区间里最小值,应该递归探索它的左子树。

如果当前节点有右子树,并且当前节点的值小于区间里的最大值,我们递归探索它的右子树。

使用二叉搜索树来做区间搜索的优势在于,可以通过剪去大量不可能包含要找的值的分支来减少计算量。

注:访问一个节点不一定代表这个节点会被包括在最终结果列表里。

二叉搜索树做区间搜索只有在需要进行多次搜索时才高效,建立一棵二叉搜索树比搜索一遍数据需要更大的计算量,搜索多次,让每次搜索的平均计算量变小。

4、向二叉搜索树中加入一个节点和寻找一个节点类似

向树中添加节点的过程中,有时会抵消掉平衡二叉树最大的有点之一:算法的高效率。

将平衡二叉树的节点数量翻倍时,它的层数只会增加1,这就意味着在搜索第一个元素时,即使你将搜索数据的数量翻倍,你的搜索也只需要多进行一步。注:这种高效率只在树左右平衡时才存在。

对于二叉搜索树,最重要的是时刻保持二叉搜索树的属性,属性规定:①左子节点(及其所有左子节点)中的值小于等于当前节点的值,②右子节点(机器所有右子节点)中的值大于等于当前节点的值。

猜你喜欢

转载自blog.csdn.net/qq_33690342/article/details/80456616