数据结构第六章:树(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41668547/article/details/81701860

1、二叉树:n个结点的有限集合,空集(空二叉树),由一个根结点和两棵互不相交的,分别称为根结点的左子树右子树的二叉树组成。

2、二叉树特点:

   (1)每个结点最多有两棵子树

   (2)左子树和右子树是有顺序的。

   (3)即使树中某结点只有一棵子树,也要区分左右。

3、特殊二叉树:斜树,满二叉树,完全二叉树

4、完全二叉树特点:

  (1)叶子结点只能出现在最下两层

  (2)最下层的叶子一定集中在左部连续位置。

  (3)倒数两层,若有叶子结点,一定都在右部连续位置。

  (4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。

  (5)同样结点的二叉树,完全二叉树的深度最小。

5、二叉树性质:

(1)第i层至多有2^(i-1)个结点。

(2)深度为k的至多有2^k-1个结点。

(3)终端结点数为n0,度为2的结点数为n2,则,n0=n2+1。

(4)具有n个结点的完全二叉树的深度为 [log2 n]+1([x]表示不大于x的最大整数)。

(5)a、如果结点i=1,无双亲,如果i>1,其双亲为【i/2】。

         b、如果2i>n,则结点i无左孩子;否则其左孩子是2i。

         c、如果2i+1>n,则结点i无右孩子;否则其右孩子是2i+1。

6二叉树的顺序存储:从左到右,从上到下。

7、二叉链表:

Lchild

Data

Rchild

8遍历二叉树:从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点有且仅被访问一次。(递归方法)

   遍历方法:

  1. 前序遍历:先数据,再左,最后右。
  2. 中序遍历:先左,再数据,最后右。
  3. 后序遍历:先左,再右,最后数据。
  4. 层序遍历:从上到下,从左到右。

9二叉树遍历性质:可以唯一确定一棵二叉树,要已知   前,中。或 后,中。

10、指向前驱或后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树

11对二叉树以某种次序遍历使其变为线索二叉树的过程称作是线索化

12

Lchild

Ltag

Data

Rtag

Rchild

13tag为0时有孩子,为1时左边为前驱,右边为后继

14enum {link,thread},link==0指向孩子的指针,thread==1指向前驱或后继。

15线索化的实质就是将二叉链表中的空指针改为指向前驱或后继的线索。

线索化的过程就是在遍历的过程中修改空指针的过程。

16遍历的代码等于是个链表的扫描,时间复杂度为O(n)。如果所用的二叉树需经常遍历查找结点时需要某种遍历序列中的前驱和后继,那么采用线索二叉链表的存储结构就是非常不错的选择。

17、树转换为二叉树:兄弟连线,除长子与双亲连线其余都消去。

18森林换为二叉树:每棵树换为二叉树,后根结点是前个根结点的右孩子。

19、二叉树换为森林:根结点的右孩子线消去,再将各个树换为二叉树。

20树的遍历,先根遍历树,后根遍历树。

21森林的遍历,前序遍历,后序遍历。

22赫夫曼树,树结点间的边相关的树叫做权weight

23、从树中的一个结点另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度

24树的路径长度就是从树根到每一结点路径长度之和

25带权路径长度WPL最小的二叉树称作赫夫曼树

26、构造赫夫曼树:

(1)把有权值的叶子结点按照从小到大的顺序排列成有序序列

(2)取头两个最小权值的结点作为一个新结点N1的两个孩子,较小的是左孩子,新结点的权值为两个叶子权值的和

(3)从新排序。

27赫夫曼编码,若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称做前缀编码。

28、字符集合{d1,d2…,dn},出现的次数或频率集合{w1,w2,…,wn},以d1,d2…dn作为结点,以w1,w2,…,wn作为相应叶子结点的权值来构造一棵赫夫曼树。左分支代表0,右分支代表1,对应字符的编码,就是赫夫曼编码。

猜你喜欢

转载自blog.csdn.net/qq_41668547/article/details/81701860