Introduction to Algorithm(chapter 12)

二叉查找树的满足这样性质的二叉树:对于一个节点,它的左子树中的任何节点都小于等于该节点的值,它的右子树中的任何节点都大于该节点的值。一般的动态集合操作如插入、删除、查找等在二叉查找树上的开销平均情况与树的高度成正比,但如果二叉查找树极其不平衡(可能形成一个线性链),那么将达到最坏开销o(n)即线性时间,而平均则是o(logn),因为二叉查找树的期望高度为logn,故要避免最坏运行时间就希望保持树的某些合理的结构--->红黑树等。

对于二叉查找树,要按次序输出所有节点中序遍历即可,即左->中->右,时间为线性时间,因为每个节点都要访问一次。

对于二叉查找树的查询search操作,运行时间为哦o(h),h为树的高度,将key和x对比,如果key小的话查找右子树,若key大的话则查找左子树,若相等则查找到。由于二叉查找树的左小右大的性质,那么一颗二叉查找树的最小节点肯定在左子树的最左边,即while(left(node)=null) node = left(node)那么就可以找到最小节点,同样最大节点肯定在右子树的最右边即while(right(node)=null) node = lright(node).

对于查找二叉查找树某节点x在中序遍历下的后继y,如果x有右子树,那么右子树的最小节点即是后继,如果x没有右子树,那么后继必是x的某个最低祖先节点,且该祖先节点的左孩子也是x的祖先或者就是x,因为y>x,那么从y到x的路径,必须要经过y的左孩子节点,即x是y的左子树中的最大节点,可以通过这样的循环来判断,q=parent(x);

while(q!=NULL && x = right(q){x=q;q=parent(q);},即沿着父节点一直向上直到某个节点是父节点的左孩子终止。

对于寻找X的前驱节点也一样,如果有左子树那么就是x的左子树的最大节点,否则沿着父节点向上找,直到遇到某个最低节点y且y的右孩子也是x的祖先。

二叉查找树(BST)的插入,就是先确定插入位置然后插入即可,每次插入的位置肯定在叶子节点上。先确定该叶子的父节点是谁,如果Key大于该父节点,那么插入右边叶子,否则左边叶子。

BST的删除例如删除x节点,要视x的子女情况而定,如果x没有子女那么直接删除;如果有一个子女,那么删除该节点并用该子女来代替该节点;如果有两个子女,那么用前驱(左子树的最右节点)或者后继(右子树的最左节点)来代替该节点,并删除这个代替节

BST的查找、插入和删除的时间都为o(h),h为树的高度。

随机构造二叉查找树:在构造二叉树的时候,当选定某个关键字称为根节点之后,那么比这个关键字大的关键字都将出现在该节点的右字数,小的关键字都将出现在左子树。这个过程与快速排序选定中轴节点的过程及其相似。进一步,所有的结点都将与根节点进行比较,但左子树中的结点不会与右子树的结点比较,反之亦然。可以看出构造二叉查找树的过程与快速排序的过程惊人地相似,实际上如果将选定根节点和选定中轴结点相对应,那么两者整个过程中所进行的元素比较是完全相同的,只是顺序不一致而已(引自某博客)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值