关于数据结构:树与二叉树

33次阅读

共计 1304 个字符,预计需要花费 4 分钟才能阅读完成。

1. 树的一些论断:

(1)节点个数 = 度数 +1

(2)一个概念的辨析:树的度(例如为 n)和 m 叉树
树的度:示意一个树必有一个节点的度为 n,且肯定不为空树,节点数起码为 n +1
m 叉树:能够为空树,能够所有节点的度都小于 m

2. 二叉树的一些论断

(1)非空二叉树中:n0=n2+1

(2)齐全二叉树的话:n1 肯定为 0 或 1,n0 与 n2 的和肯定为奇数

3. 二叉树的顺序存储

struct TreeNode{
      Elemtype value; 
      bool isEmpty;
} 

二叉树的顺序存储,是通过数组存储的。但无论是不是齐全二叉树,都必须依照齐全二叉树来进行存储。如果那个地位没有树,就填 0,但那个地位必须有。(即最坏状况:哪怕是高度为 h 的,只有 h 个节点的树(只有右结点),也须要 2 的 h 次方减一个存储单位)

所以,一般来说,顺序存储,只适宜齐全二叉树。(但不是齐全的也能够,但比拟节约)

4. 二叉树的链式存储

typedef struct BitNode{
      Elemtype data;
      struct BitNode *lchild,*rchild;
}BitNode,*BitTree;

n 个节点,应该有 2n 个指向域,但只会有 n - 1 个指针,所以肯定有 n + 1 个空链域。

因为二叉树不便找左右孩子节点,但不不便找父亲节点,所以能够引入一个父亲节点。

typedef struct BitNode{
      Elemtype data;
      struct BitNode *lchild,*rchild;
      struct BitNode *parent;
}BitNode,*BitTree;

5. 二叉树的遍历
先序——前缀表白
中序——中断表白
后序——后缀表白
层序遍历:从上到下,从左至右

6. 由遍历推二叉树
前 / 后 / 档次 + 中能够推(都是先找根节点在哪,而后在分左右子树,再推)

7. 线索二叉树

typedef struct ThreadNode{
      Elemtype data;
      struct ThreadNode *lchild,*rchild;
      int ltag,rtag;------ 左右线索标记
}ThreadNode,*ThreadTree;

中序线索化(只有没有左右孩子,ltag 和 rtag 就为 1)

先序线索化(只有先序线索化会有转圈的问题(第一张图),只有 ltag=0 能力先序线索化)

后序同中序(根本代码雷同)

线索二叉树找前序和后继(先序是在左孩子存在,后序是在右孩子存在的状况下(即没有对应的线索指针))

8. 树

(1)双亲表示法

增:新增元素,间接在表中增加即可,无需按程序

删:(1)将前面的数字改为 -1(会减少空数据,升高效率)(2)删除该元素以及其子元素(如果有)

长处:查找双亲不便
毛病:查找孩子节点须要从头遍历

(2)孩子表示法

(3)孩子兄弟表示法(即树与二叉树的转换)

(4)森林和树的转换

(5)树的遍历
树的先根遍历——对应二叉树的先序遍历(深度优先遍历)

树的后根遍历——对应二叉树的中序遍历(深度优先遍历)

树的层序遍历——从上至下,从左至右(广度优先遍历)

(6)森林的遍历
森林的先序遍历——所有树的先序遍历

森林的中序遍历——所有树的后序遍历

遍历总结:

(7)哈夫曼树的结构

(8)如何对数据编码(无前缀编码:即所有的字母或数据皆为叶子节点)

正文完
 0