21
- O( l o g l o g N log log N loglogN)
- 使8比特高度计数器溢出的AVL树的高度将超过255
22
23
访问3后
访问9后
访问1后
访问5后
24
假定删除后以左子树的根作为新根。
25
- 523776
- 263116 133114 68216 36836 21181 13873
- Find(9)之后
内部路径的计算代码见仓库
运行结果如图
26
待完善
27
待完善
28
29
30
31
高度为H的二叉树中,节点的最大个数是
2
H
+
1
−
1
2^{H+1}-1
2H+1−1。2
见仓库
32
因为在每个节点的操作都是常数时间,所以如果找到了上下界的节点的话,那么时间界就是
O
(
K
)
O(K)
O(K)。因为树的平均深度是
O
(
l
o
g
N
)
O(logN)
O(logN),所以如果一直找到了树叶的话,那么时间界就是
O
(
K
+
l
o
g
N
)
O(K+logN)
O(K+logN)。
函数PrintInterval见仓库
33
待完善
34
待完善
35
因为队列的每次操作是常数时间,会进行N次入队和N次出队,所以时间界就是
O
(
N
)
O(N)
O(N)。
函数LevelOrder见仓库
36
37
当一个关键字被删除时,需要更新内部节点的信息。
此实现,在插入和删除的时候都会搜索同一个父节点下所有的兄弟节点,优先进行均衡关键字个数,然后才会进行分裂或合并。
见仓库
38
唯一的不同是儿子数少于 2 M / 3 2M/3 2M/3时合并内部节点。
39
此图是答案上面的,懒得自己画了
40
function Travel
if 节点不为NULL
print element
if 节点的兄弟不为NULL
function Travel 节点的兄弟
if 节点的儿子不为NULL
function Travel 节点的儿子
end
41
int Similar(BinaryTree T1,BinaryTree T2)
{
if(T1==NULL)||(T2==NULL)
return T1==NULL&&T2==NULL;
return Similar(T1->Left,T2->Left)&&Similar(T1->Right,T2->Right);
}
42
bool Isomorphic(SearchTree T1, SearchTree T2)
{
if((T1 == NULL) ^ (T2 == NULL))
return false;
if(T1 == NULL && T2 == NULL)
return true;
if(T1->Element == T2->Element)
{
if(Isomorphic(T1->Left,T2->Left) && Isomorphic(T1->Right,T2->Right))
return true;
if(Isomorphic(T1->Left,T2->Right) && Isomorphic(T1->Right,T2->Left))
return true;
}
return false;
}
43
待完善
44
在每个节点添加一个关键值,表明以该节点为根的树的大小。
45
- 待完善
- 待完善
- 有点是遍历树时很容易使用非递归的方法。
46
待完善