首页 > 代码库 > 3、非线性结构--树与二叉树——数据结构【基础篇】
3、非线性结构--树与二叉树——数据结构【基础篇】
非线性结构--树与二叉树
二叉树的基础知识:
二叉树的特点:
1、每个结点的度<=2
2、二叉树是有序树
二叉树的五种不同的形态:
1、空树
2、一个根结点的根树
3、左子树
4、右子树
5、左右并存的二叉树
二叉树的性质:
性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)
性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)
性质3:包含n个结点的二叉树的高度至少为log2 (n+1)
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
二叉树的存储结构:
顺序存储结构:
1、连续
2、编号法
3、一般的二叉树这样存储会造成大量的空间的浪费
链式存储结构:
二叉树的遍历形式:
1、按层遍历——从上到下,从左到右依次访问每个结点
2、中序遍历 (中缀表达式)——先访问左子树,再访问根结点,最后访问右子树
3、先序遍历 (前缀表达式)——先访问根结点,再访问左子树,最后访问右子树
4、后序遍历 (后缀表达式)——先访问右子树,再访问左子树,最后访问根结点
二叉树的一些特点:
1、如何可唯一地确定一棵二叉树
先序+中序或后序+中序均可唯一地确定一棵二叉树
先序序列找根
中序序列找位置
2、二叉树的二叉链表存储结构中,有多少个指针域未利用
二叉树的二叉链表存储结构中,有n+1个指针域未利用,已经使用的有n-1个指针域,共有2n个指针域
线索二叉树:
实质:对一个非线性结构进行结构化操作,是每个结点(除第一和最后一个外)在这些线性序列中有且有一个前驱结点和后继结点
线索二叉树寻找某个结点的前驱结点或者后继结点的操作前提是之前指定了某一个遍历的顺序
哈夫曼树:
1、路径长度:两个结点之间的路径长度是连接两结点的路径上的分支数
2、树的路径长度:是各结点到根结点的路径长度之和
3、带权路径长度达到最小的二叉树——最优二叉树
4、在哈夫曼树中,权值大的结点立根最近
5、哈夫曼编码——实现数据压缩
哈夫曼编码是一种无前缀的编码
6、哈夫曼树的构造
1)将一组数据按从小到大进行排序
2)拿出最小的两个数据进行合并,将得到的和的结果最后重新与剩下的数据按照从小到大的顺序进行排序
3)继续2的操作
4)直至森林中只有一棵树
注意:哈夫曼编码时,左子树标注为0,右子树标注为1
注意:在构造哈夫曼树时,权值小的放到左子树,权值大的放到右子树
树和森林:
1、树的双亲表示——根没有双亲一般置为-1,根的指针编号为0
2、树的孩子表示
3、树的双亲孩子表示
4、孩子兄弟表示
树、森林和二叉树的转换:
1、树转换成二叉树:
连线:将相邻兄弟之间连线
抹线:抹掉双亲与除左孩子外其它孩子之间的连线
旋转:只需将树作适当的旋转
垂直方向或垂直偏左的作其左子树,水平方向的作其右子树
2、森林转换成二叉树:
1)将森林中每一棵树分别转换成二叉树
2)合并:使得第n棵树接入到第n-1棵的右边并成为他的右子树,依次下去,最后直至剩下一棵二叉树
3、二叉树还原成树或森林:
1)右链断开
将二叉树的根结点的右链及右链的右链等全部断开,得到许多棵无右子树的二叉树
2)将1)中得到的每一棵二叉树都还原成树
树和森林的遍历:
树和森林只有先序遍历和后序遍历
1)树的先序遍历
如果树非空,则先访问根结点,然后依次先序遍历各子树
2)森林的先序遍历
如果森林非空,则先访问森林中第一棵树的根结点,再先序遍历第一棵树各子树,再先序遍历第二棵树......直至最后一棵树
注意:树和森林的先序遍历等价于它转换成的二叉树的先序遍历,树和森林的后序遍历等价于它转换成的二叉树的中序遍历
3、非线性结构--树与二叉树——数据结构【基础篇】