算法导论学习笔记——第12章 二叉查找树

二叉查找树性质

设x是二叉查找树中的一个结点,如果y是x的左子树中的一个结点,则k[y]<=key[x];如果y是右子树中的一个结点,则k[y]>=k[x]

1 //中序遍历算法,输出二叉查找树T中的全部元素
2 INORDER-TREE-WALK(x)
3 if x!=nil
4     then INORDER-TREE-WALK(left[x])
5             print key[x]
6             INORDER-TREE-WALK(right[x])

查找

 1 //递归版本
 2 TREE-SEARCH(x,k)
 3 if x=nil or k=key[x]
 4     then return x
 5 if k<key[x]
 6     then return TREE-SEARCH(left[x],k)
 7     else return TREE-SEARCH(right[x],k)
 8
 9 //非递归版本
10 ITERATIVE-TREE-SEARCH(x,k)
11 while x!=nil and k!=key[x]
12     do if k<key[x]
13         then x←left[x]
14         else x←right[x]
15 return x

最大元素,最小元素,next和prev

 1 TREEMINIMUM(x)
 2 while left[x]!=nil
 3     do x←left[x]
 4 return x
 5
 6 TREE-MAXIMUM(x)
 7 while right[x]!=nil
 8     do x←right[x]
 9 return x
10
11 TREE-SUCCESSOR(x)
12 if right[x]!=nil
13     then return TREE-NIMIMUM(right[x])
14 y←p[x]
15 while y!=nil and x=right[y]
16     do x←y
17         y←p[y]
18 return y

插入

 1 TREE-INSERT(T,z)
 2 y←nil
 3 x←root[T]
 4 while x!=nil
 5     do y←x
 6         if key[z]<key[x]
 7             then x←left[x]
 8             else x←right[x]
 9 p[z]←y
10 if y=nil
11     then root[T]←z
12     else if key[z]←key[y]
13         then left[y]←z
14         else right[y]←z

删除

 1 TREE-DELETE(T,z)
 2 if left[z]=nil or right[z]=nil
 3     then y←z
 4     else y←TREE-SUCCESSOR(z)
 5 if left[y]!=nil
 6     then x←left[y]
 7     else x←right[y]
 8 if x!=nil
 9     then p[x]←p[y]
10 if p[y]=nil
11     then root[T]←x
12     else if y=left[p[y]]
13         then left[p[y]]←x
14         else right[p[y]]←x
15 if y!=x
16     then key[z]←key[y]
17         copy y‘s satellite data into z
18 return y
时间: 2024-10-04 16:52:03

算法导论学习笔记——第12章 二叉查找树的相关文章

算法导论学习笔记——第13章 红黑树

红黑树 红黑树是一种二叉查找树,但在每个结点上增加一个存储位存储结点的颜色,可以是red或black.通过对任意一条从根到叶的路径上结点颜色的限制,红黑树确保没有任何一条路径比其他路径长出两倍,因而是接近平衡的. 每个结点包含5个域,color,key,left,right,p 满足以下红黑性质: 1.每个结点是红色或黑色 2.根结点是黑色 3.每个叶结点(nil)是黑色 4.如果一个结点是红色,那么它的两个子结点都是黑色 5.对每个结点,从该结点到它每个子孙结点的路径上,黑结点数目相同 左旋转

算法导论学习笔记——第1章

所谓算法,就是定义良好的计算过程,它取一个或一组值作为输入,并产生出一个或一组值作为输出.亦即,算法是一系列的计算过程,将输入值转换成输出值. 一些常见的算法运行时间量级比较:对数级<多项式级<指数级<阶乘级 1 lgn < n 1/2 < n < nlgn < n 2 < n 3 < 2 n < n!

算法导论学习笔记——第10章 基本数据结构

栈 1 Stack-EMPTY(S) 2 if top[S]=0 3 then return TRUE 4 else return FALSE 5 6 PUSH(S,x) 7 top[S]←top[S]+1 8 S[top[S]]←x 9 10 POP(S) 11 if STACK-EMPTY(S) 12 then error "underflow" 13 else top[S]←top[S]-1 14 return S[top[S]+1] 队列 1 ENQUEUE(Q,x) 2 Q[

算法导论学习笔记——第8章 线性时间排序

任意一种比较排序算法,在最坏情况下的运行时间下限是Ω(nlgn) 计数排序 假设n个输入元素中的每一个都是介于0到k之间的整数,k为某个整数,当k=O(n)时,计数排序的运行时间为Θ(n) 1 //输入数组A[1..n],存放排序结果数组B[1..n],临时存储区C[0..k] 2 COUNTING-SORT(A,B,k) 3 for i←0 to k 4 do C[i]←0 5 for j←1 to length[A] 6 do C[A[j]]←C[A[j]]+1 7 for i←1 to k

算法导论学习笔记——第7章 快速排序

快速排序 1 QUICKSORT(A,p,r) 2 if p<r 3 then q←PARTITION(A,p,r) 4 QUICKSORT(A,p,q-1) 5 QUICKSORT(A,q+1,r) 6 7 PARTITION(A,p,r) 8 x←A[r] 9 i←p-1 10 for j←p to r-1 11 do if A[j]<=x 12 then i←i+1 13 exchange A[i]↔A[j] 14 exchange A[i+1]↔A[r] 15 return i+1 随

算法导论学习笔记 第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种时间复杂度为O(n^2)的排序算法.虽然最环情况的复杂度高,但是快速排序通常是实际应用排序中最好的选择,因为快排的平均性能非常好:它的期望复杂度是O(nlgn),而且O(nlgn)中的常数因子非常小.另外,快速排序还可以实现原址排序,甚至在虚拟环境中也能很好的工作. 1 快速排序的描述 与归并排序一样,快速排序也使用了分治法的思想,下面是对一个典型的子数组A[p.. r]进行快速排序的分治过长: 分解:数组A[p.. r]被划分为两个(可能为空)子数组

算法导论学习笔记——第11章 散列表

直接寻址表 1 DIRECT-ADDRESS-SEARCH(T,k) 2 return T[k] 3 4 DIRECT-ADDRESS-INSERT(T,x) 5 T[key[x]]←x 6 7 DIRECT-ADDRESS-DELETE(T,x) 8 T[key[x]]←nil

算法导论学习笔记——第6章

堆 堆数据结构是一种数组对象,可以被视为一棵完全二叉树. 对于给定的数组A,树的根为A[1],对于给定的下标为i的结点A[i],其父结点PARENT(i)=floor(i/2),左子结点LEFT(i)=2i,右子结点RIGHT(i)=2i+1 叶级结点的高度可以认为是0,每向上一层,高度加一,定义树的告诉为根结点的高度. P74

算法导论学习笔记——第4章

解递归式 1.代换法substitution 1)猜测解的形式 2)用数学归纳法找出使解真正有效的常数 2.递归树 使用递归树时,可以忽略一些“小误差”,将递归产生的结果作为猜测,用代换法进行验证. 也可以严格计算每一层递归树的代价,加总成递归式的结果. 对于有两个子问题,子问题规模为1/2的递归树(二叉树),树的高度是lgn,叶级节点的数量是n 3.主方法master method 递归式形式T(n)=aT(n/b)+f(n),其中a>=1,保证有一个及以上子问题:b>1,保证问题的规模逐步