满二叉树
所有节点只有0或者两个节点
![4a86ed6e1106e1fbab3c69937688a179.png](https://i-blog.csdnimg.cn/blog_migrate/d021b7a166f1942113653f42c785c2bb.png)
完全二叉树
假如该二叉树有n层
前n-1层的节点都排满
最后第n层的所有节点都靠左排列,不一定排满
![ff23542fbe2a94c3b59ad817c1a3a802.png](https://i-blog.csdnimg.cn/blog_migrate/5354e13cd5a92051543ae883915ee270.png)
二叉查找树
也叫二叉搜索树
left.val<=parent.val
parent.val<=right.val
平衡二叉树(AVL)
- 可以是空树。
- 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1
哈弗曼树
- 是一种带权路径长度最短的二叉树,也称为最优二叉树。
- 带权路径长度达到最小,就是最优二叉树
- 由权值为9,5,2,7的四个叶子节点构造一棵最优二叉树,该树的带权路径长度为:44
![c2e2bad4762f65f8ec4736637b5eb881.png](https://i-blog.csdnimg.cn/blog_migrate/feb30d3433f0be9510ac5098394cbc0f.jpeg)
线索二叉树
一个有n个结点的二叉链表。每一个结点有指向左右孩子的两个指针域,一共是2n个指针域。n个结点的二叉树一共同拥有n-1条分支线(根结点无前驱),存在2n-(n-1)=n+1个空指针域
![c696a20d27d93b928cf50c0f4a232f5b.png](https://i-blog.csdnimg.cn/blog_migrate/3bf8589058945e8c79625ff00f0cfbe0.jpeg)
将指向前驱和后驱的指针称为线索,加上线索的二叉链表则称为线索链表;加上线索的二叉树称为线索二叉树(Threaded Binary Tree)
中序遍历结果:H、D、I、B、J、J、E、A、F、C、G
中序遍历后,将所有的空指针域中的rchild,改为指向它的后继结点。通过指针知道H的后继是D(①),I的后继是B(②),J的后继是E(③),E的后继是A(④),F的后继是C(⑤),G的后继因为不存在而指向NULL(⑥)。此时共有6个空指针域被利用
![e0ca64d8325e710122ec60971f843369.png](https://i-blog.csdnimg.cn/blog_migrate/dbd188b58bd98f9519123eae26d05401.png)
将这棵二叉树的所有空指针域中的lchild,改为指向当前结点的前驱。H的前驱是NULL(①),I的前驱是D(②),J的前驱是B(③),F的前驱是A(④),G的前驱是C(⑤)。一共5个空指针域被利用,正好和上面的后继加起来是11个
![fa29b363d5348eb1957eb400331870dd.png](https://i-blog.csdnimg.cn/blog_migrate/f2022ca936206d15721fad1918359187.png)
线索二叉树,等于是把一棵二叉树转变成了一个双向链表,对插入删除结点、查找某个结点都带来了方便。
对二叉树以某种次序遍历使其变为线索二叉树的过程称做是线索化
![6619da1ca8c20309306b57364154974e.png](https://i-blog.csdnimg.cn/blog_migrate/0c0a496076746cb2149238c861dfc819.png)
空心箭头实线为前驱,虚线黑箭头为后继
每个结点再增设两个标志域ltag和rtag,ltag和rtag只是存放0或1数字的布尔型变量,占用的内存空间要小于像lchild和rchild的指针变量
![026c10ba7dfa5912d94354655b16aebe.png](https://i-blog.csdnimg.cn/blog_migrate/a23f92f9154ff474283de6a3c38283cc.png)
- ltag为0时指向该结点的左孩子,为1时指向该结点的前驱
- rtag为0时指向该结点的右孩子,为1时指向该结点的后继
![0483e932f179ac82c5eae87eb3497823.png](https://i-blog.csdnimg.cn/blog_migrate/a82045622ea76c0c8b0dd0b49eaca36f.png)