数据结构之树
目录:
二叉树的结构
二叉树的性质
二叉树的遍历
二叉树的特例
二叉树典型程序
树是一种编程中常常用到的一种数据结构,它的逻辑是:除了根结点之外每个结点只有一个父结点,根结点没有父结点;除了叶结点之外所有结点都有一个或多个子结点,叶结点没有子结点。父结点和子结点之间用指针连接。
二叉树是一种特殊的树结构,即二叉树中每个结点最多只能有两个子结点。
二叉树的结构:struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
二叉树的性质
在二叉树的第i层上最多有2 i-1 个节点 。(i>=1)
二叉树中如果深度为k,那么最多有2k-1个节点。(k>=1)
n0=n2+1 n0表示度数为0的节点 n2表示度数为2的节点
在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]+1是向下取整。
若对含 n 个结点的完全二叉树从上到下且从左至右进行1 至n 的编号,则对完全二叉树中任意一个编号为i 的结点:
(1) 若i=1,则该结点是二叉树的根,无双亲, 否则,编号为[i/2] 的结点为其双亲结点;
(2) 若2i>n,则该结点无左孩子, 否则,编号为2i 的结点为其左孩子结点;
(3)若2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点
二叉树的遍历:
前序遍历:先访问根结点,再访问左子结点,最后访问右子节点;
中序遍历:先访问左子结点,再访问根结点,最后访问右子节点;
后序遍历:先访问左子结点,再访问右子节点,最后访问根结点;
(前三种遍历都有递归和循环两种不同的实现方式,递归都要比循环实现要简洁)
宽度优先遍历:先访问树的第一层结点,再访问树的第二层结点......一直到最后一层结点。在同一层结点中,以从左到右的循序依次访问。
二叉树的特例
1.二叉搜索树
又叫二叉查找树或者二叉排序树
左子结点总是小于或等于根结点,而右子节点总是大于或等于根结点;
2.平衡二叉树
3.红黑树
红黑树的定义:
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目。
红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如实时应用(real time application)中有价值,而且使它们有在提供最坏情况担保的其他数据结构中作为建造板块的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树。此外,红黑树还是2-3-4树的一种等同,它们的思想是一样的,只不过红黑树是2-3-4树用二叉树的形式表示的。
红黑树的性质:
红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制的一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 节点是红色或黑色。
性质2. 根是黑色。
性质3. 所有叶子都是黑色(叶子是NIL节点)。
性质4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
下面是一个具体的红黑树的图例:
这些约束确保了红黑树的关键特性: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
要知道为什么这些性质确保了这个结果,注意到性质4导致了路径不能有两个毗连的红色节点就足够了。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。因为根据性质5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。
4.堆:
最大堆和最小堆;在最大堆中根结点的值最大,在最小堆中根结点的值最小。(需要快速查找最大值或者最小值的问题经常用堆来解决)
5.完全二叉树:
假设一个深度为h的二叉树,除第h层其他各层结点都达到最大,第h层的结点都集中在该层最左边的若干位置上。
6.满二叉树
满二叉树必为完全二叉树,完全二叉树不一定是满二叉树。
7.B/B-/B+树
B(B-)
B+树
以下B-树和B+树的区别参考:http://bl