044 - 问,树

044 - 问,树

树 tree

几乎所有操作系统都将文件存放在树状结构里;

几乎所有编译器都需要实现一个表达式树(expression tree);

文件压缩所使用的哈夫曼算法(Huffman’s Algorithm)需要用到树状结构;

数据库使用的B-tree是一种复杂的树状结构。

节点 nodes

边 edges

根 root

具有方向性的边 directed edges

父节点 parent

子节点 child

无子节点的称为叶节点 leaf

拥有相同的父节点的不同节点为兄弟节点 siblings

根节点至任何节点之间存在唯一路径 path

路径所经过的边数为路径长度 length

根节点至任一节点的路径长度,为该节点的深度 depth。(根节点的深度为0)

某节点至其最深子节点(叶节点)的路径长度,称为该节点的高度 height (整棵树的高度便是根节点的高度)

ancestor

descendant

所有子代包括自己的节点总数为该节点的大小 size。

二叉树 binary tree

最多只允许存在两个子节点。

二叉搜索树 binary search tree

可以提供对数时间(logarithmic time)的元素插入和访问。

任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。

平衡二叉搜索树 balanced binary search tree

为了良好的搜索效率。

平衡

大致含义:没有任何一个节点“过深”(深度过大)。

不同的平衡条件,产生不同的效率表现。

分类

1. 一般的平衡二叉搜索树

2. AVL-tree

3. RB-tree

4. AA-tree

5. ……

AVL-tree

Adelson-Velskii-Landis tree

平衡条件建立是为了确保整棵树的深度为O(logN)。

要求任何节点的左右子树高度相差最多1.

单旋转 Single Rotation

双旋转 Double Rotation

两次单旋转即可完成。

RB-tree(红黑树)

1. 二叉搜索树。

2. 每个节点不是红色就是黑色。

3. 根节点为黑色。

4. 如果节点为红,则子节点为黑。

5. 任一节点至NULL(树尾端)的任何路径,所含的黑节点数目相同。

SGI STL内部即是RB-tree。

节点代码

044 - 问,树_第1张图片

044 - 问,树_第2张图片

迭代器

双向迭代器

044 - 问,树_第3张图片

044 - 问,树_第4张图片

插入

insert_unique

wps_clip_image-28214

insert_equal

wps_clip_image-22205

都调用了

wps_clip_image-21882

调整

wps_clip_image-8060

旋转

wps_clip_image-24887

wps_clip_image-9582

更多信息参考

算法导论//TODO

你可能感兴趣的:(044 - 问,树)