数据结构(一)

树和二叉树

1.存在空树,树适合于表示具有层次结构的数据。
2.树分有序树和无序树,结点的深度是从根结点开始自顶向下逐层累加,结点的高度是从叶子结点开始,自底向上逐层累加。
3.树的性质:
(1)总结点数 = 边数/分支数/树的度 + 1;
(2)度为m的树中第i层至多有m的i-1次幂个结点(i>=1);
(3)高度为h的m叉树至多有mh-1/m-1 个结点
(s = m
(k-1) + m*(k-2) + m*(k-3)…+m+1 = mh-1/m-1,mh表示指数);
(4)具有n个结点的m叉树的最小高度h = logm(n(m-1)+1)(上取整) = logm(n(m-1))(下 取整);
(5)总结点数 = 度为0 + 度为1 + 。。。。+ 度为m
总分支数 = 1 x 度为1 + 2 x 度为2 + 。。。。+ m x 度为m
总分支数 = 总结点数 - 1;
4.Catalan 公式,给定n 个结点,能构成h(n)种不同的二叉树(队列中也可使用)
h(n) = C2n-n/(n+1)(C2n-n表示2n个中选n个)
5.在完全二叉树中,
(1)若i<=n/2,则i 为分支结点,否则为叶子结点;
(2)叶子结点只可能在层次最大的两层上出现,对于最大层次中的叶子结点,依次排列在该层的最左边;
(3)若有度为1 的结点,只可能有一个,且该结点只有左孩子而无右孩子(重要结论);
(4)出现某结点i为叶子结点或者只有左孩子,则>i的结点均为叶子结点,i/=/1时,该结点双亲结点编号为i/2下取整,若2i<=n(结点总数),则左孩子的编号为2i,否则无左孩子;若2i+1<= n ,则右孩子的编号为2i+1,否则无右孩子,结点i所在层次为log2(i)下取整+1;
(5)若n 为奇数,则每个分支结点都有左右孩子,若n 为偶数,则编号最大的分支结点(编号为n/2)只有左孩子,其余分支左右孩子都有。
6.二叉树与度为2的有序树的区别:
(1)度为2的有序树至少有3个结点,二叉树可为空;
(2)二叉树的左右次序是绝对的,右左就是不同的树,而度为2 的树的左右次序时相对的,某结点只有一个孩子时,右左就是一样的了,不再有区别。
7.二叉链表中,n个结点,有n+1个空链,共2n个链,根结点不占用链。
8.中序定左右,后序分祖先。
9.树、二叉树和森林之间的相互转换
(1)树转二叉树:邻兄加一线,保哥去弟线;兄弟相连,长兄为父,孩子靠左,无右孩。
(2)森林转二叉树:树树皆转二,首树定为根,后根连前右边。
(3)二叉树转树:某点左儿在,其右皆做儿,纷纷与某连,再断全右线(左儿子的右孩子都是左儿子的兄弟结点)。
(4)二叉树转森林:所有根点断右树(每断一次都会出现新的根结点,都要继续执行此操作),分出小二再转树。
10.先序线索找后继容易,但是找前驱结点需要先知道该点双亲,后序线索找前驱容易,但是找后继难。
11.
(1)树—先根遍历<=>森林—先序遍历<=>二叉树—先序遍历
(2)树—后根遍历<=>森林—中序遍历<=>二叉树—中序遍历
12.并查集:通常用数组元素的下标代表元素名,根结点的数组下标代表子集合名,根结点的双亲为负数。
13.森林F转化为二叉树T,F中的叶子结点的个数 = T 中的左孩子指针为空的个数;F中非终端结点个数 = T中无右孩子数-1
14.平衡二叉树(AVL),带权路径长度(WPL),WPL = 结点值X 路径长度(边数),WPL最小即在含有N个带权叶子结点中,WPL最小的称为哈夫曼树,也称为最优二叉树或正则(严格)二叉树。
15.哈夫曼树构造:结点预备,选择最小的两个结点作为叶子,然后从结点集合中取出两个结点,将两个结点相加的和放入结点集合,重复此过程即可。
16.哈夫曼编码文件时,将字符在哈夫曼码中出现大的次数定为权值,从而形成出现次数越多的字符在哈夫曼树中的路径长度越短(查找结点的次数也越少)。
17.哈夫曼解码过程:
(1)压缩过程,哈夫曼编码处理源码,前缀码唯一原则,避免歧义);
(2)解码,读取哈夫曼码值,遍历哈夫曼树,码中为0,走0路,判断是否是叶子,是叶子,取出数据,然后退回到树根结点,读取下一个编码;若不是叶子结点,直接读码寻路,重复此过程,直至解码完成。
哈夫曼树根结点通往任一叶子结点的路径都不可能是通过其他叶子结点的子路径。
18.哈夫曼树并不是只有二叉树,也存在n叉哈夫曼树。
19.哈夫曼树由于存在权值存在相等或者选择左右孩子的顺序不确定性以及随意性,所以哈夫曼树是不唯一的,但是也有其构造的潜规则:
(1)左子树权值小于右子树权值;
(2)权值相同,矮的树在左边。
20.二叉哈夫曼树是不存在度为1的结点的,n叉哈夫曼树同样也不存在少于n度的结点的,若存在不能直接转化成n叉哈夫曼树的情况,可以采用添加权值为0的方式,并不影响权值总和即WPL。
21.二叉排序树中,左子树结点值小于根结点,右子树结点值大于根结点,所以任一个三元组,组内第三个值都不会大于前两个值中最大的数(自我总结,欢迎纠正)。
22.平衡二叉树结点数的递推公式为N0=0,N1=1,N2=2,Nh=1 + Nh-1 + Nh-2(h为平衡二叉树高度,Nh为构造此高度的平衡二叉树所含最少结点数)。
23.平衡二叉排序树是二叉排序树为避免树的单支高度增长过快,降低二叉排序树的性能而限制左右树高度查的绝对值不超过1的二叉排序树,即二叉排序树的平衡思想,插入新的结点会引起不平衡,需要做平衡处理(只处理最小不平衡树):
(1)LL(右单旋转):在最小不平衡二叉树的根结点A 左孩子的左子树插入,A点左孩子B右旋替代A成为根,A点右旋向下作为B的右子树,B点原右子树做A的左子树。
(2)RR(左单旋转):在A 右孩子的右子树插入,A点右孩子B左旋替代A成为根,A点左旋向下作为B的左子树,B点原左子树做A的右子树。
(3)LR(先左后右双旋):在A 左孩子的右子树插入,A点左孩子B的右子树C左上旋替代B,C再右上旋替代A。
(4)RL(先右后左双旋):在A右孩子的左子树插入,A点右孩子B的左子树C右上旋替代B,C再左上旋替代A。
首先清楚什么是最小不平衡二叉树;
②LR和RL情况下,新结点时插在C叶子结点的左边还是右边都是没有影响的;
③调平过程其实就是在哪个位置插入结点导致不平衡,就将该位置的结点调整为最小不平衡二叉树的根结点;
④平衡因子:在左边插入加1,右边插入减1;
⑤由于旋转,上调的结点的子树会和下调结点的子树冲突,此时上调结点的子树调整为下调结点的子树,还需要遵循左<中<右。

24.解决哈夫曼树编码设计问题,确保一个编码不能是其他任何一个编码的前缀码(路径唯一):画哈夫曼树,在哈夫曼树中,有效数据都是存储在叶子结点中的,编码就时在树中查找叶子结点的位置,每个编码标识唯一一个叶子结点,哈夫曼树的分支结点时没有存储数据的;另一种凡是就是二进制取值法。
25.只有两个结点的平衡二叉树根结点的度为1;平衡二叉树并不是二叉排序树,平衡二叉树并不强调结点值的大小顺序(左<中<右),个人观点则认为平衡二字就是一种思想,一种处理方式,为的是解决二叉排序树的性能问题,就是平衡化的二叉树,平衡二叉树不应该特指一种树,更应该是一种状态。
26.中序遍历二叉排序树可以得到升序列,二叉排序的定义要求就是左<中<右,其他的树并无此要求,这也是平衡二叉树不是二叉排序树的一个例证,若要中序遍历得到降序列,可以规定左>中>右,此时的树就不是二叉排序树了。
27.二叉哈夫曼树的子树权值和等于双亲的权值,译码时,直接采用前缀码与编码序列对照的凡是解码即可快速译码。
28.计算二叉排序树的平均查找长度(ASL):
(1)成功:ASL = 累加i从1到h(第i 层X 该层结点数)/n(总结点数)
(2)失败:ASL = 累加(每一层空的结点数X 该层层数)/总的空的结点数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值