二叉搜索树(算法导论第12章)
2014-08-06 21:29
190 查看
二叉搜索树(Binary Search Tree BST,也称排序二叉树,二分搜索树)是一种数据结构。
二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比。
这样一棵树可以使用一个链表数据结构来表示,其中每个结点就是一个对象。除了key和卫星数据之外,每个结点还包含属性left,right和p,它们分别指向结点的左孩子、右孩子和双亲。根结点是树中唯一父指针为NIL的结点。
二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储:
设x是二叉搜索树的一个结点。如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。
搜索算法:中序遍历(inorder tree walk-左根右),先序遍历(preorder tree walk-根左右),后序遍历(posorder tree walk-左右根)
后继和前驱(中序遍历后继):
定理:在一颗高度为h的二叉搜索树上,动态集合上的操作SEARCH、MINIMUM、MAXIMUM、SUCCESSOR、PREDECESSOR、INSERT和DELETE都可以在O(h)时间内完成。
插入和删除:
二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比。
这样一棵树可以使用一个链表数据结构来表示,其中每个结点就是一个对象。除了key和卫星数据之外,每个结点还包含属性left,right和p,它们分别指向结点的左孩子、右孩子和双亲。根结点是树中唯一父指针为NIL的结点。
二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储:
设x是二叉搜索树的一个结点。如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。
搜索算法:中序遍历(inorder tree walk-左根右),先序遍历(preorder tree walk-根左右),后序遍历(posorder tree walk-左右根)
INORDER-TREE-WALK(x) if x≠NIL INORDER-TREE-WALK(x.left) print x.key INORDER-TREE-WALK(x.right)查找:输入一个指向树根的指针和一个关键字k,如果这个结点存在,TREE-SEARCH返回一个指向关键字为k的结点的指针;否则返回NIL。
TREE-SEARCH(x,k) if x==NIL or k==x.key return x if k<x.key return TREE-SEARCH(x.left,k) else return TREE-SEARCH(x.right,k)迭代版本效率更高,代码如下:
ITERATIVE-TREE-SEAECH(x,k) while x≠NIL and k≠x.key if k<x.key x=x.left else x=x.right return x最大关键字和最小关键字:
TREE-MINIMUM(x) while x.left≠NIL x=x.left return x TREE-MAXIMUM(x) while x.right≠NIL x=x.right return x
后继和前驱(中序遍历后继):
TREE-SUCCESSOR(x) if x.right≠NIL return TREE-MINIMUM(x.right) y=x.p while y≠NIL and x==y.right x=y y=y.p return y
定理:在一颗高度为h的二叉搜索树上,动态集合上的操作SEARCH、MINIMUM、MAXIMUM、SUCCESSOR、PREDECESSOR、INSERT和DELETE都可以在O(h)时间内完成。
插入和删除:
TREE-INSERT(T,z) y=NIL x=T.root while x≠NIL y=x if z.key<x.key x=x.left else x=x.right z.p=y if y==NIL T.root=z elseif z.key<y.key y.left=z else y.right=z TRANSPLANT(T,u,v) if u.p==NIL T.root=v elseif u==u.p.left u.p.left=v else u.p.right=v if v≠NIL v.p=u.p TREE-DELETE(T,z) if z.left==NIL TRANSPLANT(T,z,z.right) elseif z.right==NIL TRANSPLANT(T,z,z.left) else y=TREE-MINIMUM(z.right) if y.p≠z TRANSPLANT(T,y,y.right) y.right=z.right y.right.p=y TRANSPLANT(T,z,y) y.left=z.left y.left.p=y
相关文章推荐
- 【算法导论】学习笔记——第12章 二叉搜索树
- 算法导论-第12章-二叉搜索树:随机二叉搜索树数据结构C++实现(前中后序遍历,插入,搜索,前后毗邻元素,最大最小值)
- 【算法导论】最优二叉搜索树
- BST 二叉搜索树 C++ 算法导论
- MIT:算法导论——9.二叉搜索树
- [算法导论]第十二章《二叉搜索树》
- 二叉查找树——算法导论第12章简易代码实现~
- 【算法导论】二叉搜索树的插入和删除
- 【算法导论】第12章二叉查找树
- 【算法导论】动态规划之“最优二叉搜索树”
- 动态规划之最优二叉搜索树(算法导论)
- 【算法导论】最优二叉搜索树
- 动态规划之最优二叉搜索树(算法导论)
- 二叉搜索树(算法导论)
- 【算法导论】二叉搜索树
- 实现算法导论第三版中的二叉搜索树
- 二叉排序树(Binary Sort Tree,二叉查找树,二叉搜索树)--【算法导论】
- 算法导论之动态规划:最优二叉搜索树
- 算法导论程序27-什么是二叉搜索树