一、二叉树的顺序存储表示
利用满二叉树的特性,在线性表中存储数节点;因此可以利用节点的编号(从左到右,按层标记,根节点标记为0)作为数组的下标,且父节点(p)和子节点(c)下标存在如下关系:p=(c-1)/2;c1=2*p+1;c2=2*p+2。
缺点:如果数是一棵稀疏的树,那么会浪费大量存储空间。
二、二叉树的链表存储表示
三叉链表结构中每个树节点有一个指向父节点的指针,有一个指向左子孩子节点的指针,一个指向右子孩子节点的指针。
三、二叉树遍历
如果L-D-R分别表示访问左子树,访问根,访问右子树,那么遍历树的三种顺序是:前序遍历(D-L-R)、中序遍历(L-D-R)、后序遍历(L-R-D)。
中序遍历二叉搜索树能以递增的顺序遍历树的所有值。
四、排序二叉树
排序二叉树具有以下性质:
- 若任意节点的左子树不为空,则左子树上任一节点的键值都比节点的键值小;
- 若任意节点的右子树不为空,则右子树上任一节点的键值都比节点的键值大;
- 任意节点的左、右子树都是排序二叉树;
- 排序二叉树没有键值相等的节点;
构建一棵排序二叉树的过程就是一个排序过程。排序二叉树的搜索、删除、插入的复杂度等于树高(log 2 N)。
二叉搜索树T中查找x(即排序树)的算法:
- 若T是空树,返回失败,否则;
- 若x等于根节点键值,返回根节点,否则;
- 若x小于根节点的键值,在T的左子树中查找x,否则;
- 在T的右子树中查找x;
二叉搜索树T新增节点N的算法:
- 若T是一棵空树,根节点指针(引用)指向节点N,N成树的根节点,否则;
- 若N的键值等于根节点的键值,返回失败,否则;
- 若N的键值小于根节点的键值,将N节点新增到左子树上,否则;
- 把N新增到右子树上;
二叉搜索树T删除一个节点K的算法(指向K的指针假设为*p):
- 如果K是叶子节点,直接删除K(*p置为null);
- 如果K只有一个子树,当K是父节点的左子节点时,把K的子树挂到K的父节点的左子树上;当K是父节点的右子节点时,把K的子树挂到K的父节点的右子树上;
- 如果K有两棵子树,那么合并K的两棵子树形成新的排序树T1,最后将指向K的指针(引用)指向T1的根节点,删除完成;合并K的子树的过程就是把左子树挂到右子树的最小叶子节点(最左边的叶子节点)的左子树上。
构造一棵排序二叉树的过程就是一个排序过程,最差时间复杂度是n平方。使用二叉排序树CPU cache的性能较差,堆排序的CPU cache性能较好。另外,排序二叉树是性能最好的增量排序算法。
五、红黑树
红黑树是一种自平衡二叉排序树。好处:红黑树对搜索、删除、新增操作的时间复杂度提供最好可能的最差情况担保。红黑树的持久版本每次新增或是删除操作需要logn的时间复杂度和logn的空间。