数据结构与算法分析之树的概念总结

来源:互联网 发布:徐老师淘宝叫什么名字 编辑:程序博客网 时间:2024/05/29 02:21


1.二叉查找树的大部分操作运行时间平均为O(logN)


2.树是N个节点和N-1条边的集合,其中一个节点叫做根。存在N -1条边的结论由下面的事实得出:
每条边都将某个节点连接到它的父亲,除根节点以外每个节点都有一个父亲


3.没有儿子的节点称为树叶


4.路径定义:从节点n1到nk的路径定义为节点n1,n2,...nk的一个序列,使得对于1<= i <k,节点
ni是n(i+1)的父亲。

5.路径的长定义为该路径上边的条数。


6.一颗树中从根到每个节点恰好存在一条路径


7.对任意节点ni, ni的深度为从根到ni的唯一路径长度(深度定义方向是从根到节点,起点是根终点是ni)


8.ni的高是从ni到一片树叶的最长路径的长,因此所有树叶的高度都是0(高度方向是从节点到树叶,起点是ni,终点是树叶)


9.一颗树的深度等于它的最深的树叶的深度,该深度总是等于这棵树的高。树的高度和深度定义实际是从根节点算起。


10.树的应用:
a.操作系统中目录结构的应用

11.先序遍历(preorder traversal):在先序遍历中,对节点的处理工作是在它的诸儿子节点被处理之前进行。
即先处理父亲节点后处理儿子节点。

12.后序遍历(postorder traversal):每个节点的处理工作是在它的诸儿子节点处理后进行的。(先处理儿子节点再处理父亲节点)


13.二叉树:树上每个节点都不能有多于两个的儿子。


14.二叉树的平均深度为O(sqrt(N)),对于特殊类型的二叉查找树,其平均深度为O(logN)。


15.二叉树的主要用处之一是在编译器设计领域用于描述表达式。


16.表达式树:树叶是操作数,其他节点是操作符。表达式树不一定是2叉树,有三元运算符的时候儿子节点会有3个。
a.中序遍历产生的表达式是中缀表达式,后序遍历产生的表达式是后缀表达式,先序遍历产生的表达式是前缀表达式

17.通过中缀或者后缀表达式构造表达式树的方法:
关键点:a.如果是中缀则根据第3章的方式修改为后缀表达式
b.遇到操作数入栈,遇到操作符时,从栈中弹出两个指针(可能是操作数或操作符)作为操作符的两个儿子节点,然后将操作符指针入栈

18.二叉查找树:对于树中每个节点X,它的左子树中所有关键字的值小于X的关键字值,它的右子树中所有关键字值大于X的关键字值。


19.对于二叉查找树的插入操作,最终的插入点一定是空的节点上,不会存在插入点上已有节点的情况。也就是插入点是新建的节点。


20.假设所有的树出现的机会均等,则树的所有节点的平均深度为O(log N)


21.一颗树的所有节点的深度的和称为内部路径长(internal path length)


22.AVL(Adelson-Velskii和Landis)树是带有平衡条件的二叉查找树。其每个节点的左子树和右子树的高度最多查1的二叉查找树。


23.对于AVL树的插入操作,破坏的是从插入点到根节点的路径上的节点的平衡。因为只有这些节点的子树可能发生变化。
所以插入操作时,需要沿着插入点到根节点去更新每个节点的新高度,当发现节点左右子树的高度差大于等于2时,说明
找到了一个不平衡的节点,需要通过旋转去恢复树的平衡性。第一个不平衡的节点也是所有不平衡的节点中最深的那个。


24.假设节点a处的高度不平衡,容易看出造成这种不平衡的情况有四种:
1.对a的左儿子的左子树进行一次插入(左-左)
2.对a的左儿子的右子树进行一次插入(左-右)
3.对a的右儿子的左子树进行一次插入(右-左)
4.对a的右儿子的右子树进行一次插入(右-右)
其中情形1和4是关于a点的镜像对称,2和3是关于a点的镜像对称。所以理论上属于两种情况,第一种情况是插入发生在"外边"的情况(即左-左或右-右)
该情况可以通过对树的单旋转来调整。第二种情况是插入发生在内部的情形(即左右和右左的情况),此种情况需要通过复杂一些的双旋转来调整。
双旋转又可以通过两次单旋转来完成。

25.树的遍历
先序遍历:先处理父节点再处理儿子节点
中序遍历:先处理左儿子节点再处理父亲节点最后处理右儿子节点
后序遍历:先处理儿子节点在处理父亲节点
层序遍历:所有深度为D的节点要在深度为D+1的节点之前处理。需要用队列实现。

26.B树
多叉的查找树,阶为M的B树需满足下列约束:
a.树的根或者是一片树叶,或者其儿子数在2和M之间
b.除了根外,所有的非树叶节点的儿子数在[M/2]和M之间
c.所有的树叶都在相同的深度上

0 0