满二叉树
所有节点只有0或者两个节点
完全二叉树
假如该二叉树有n层
前n-1层的节点都排满
最后第n层的所有节点都靠左排列,不一定排满
二叉查找树
也叫二叉搜索树
left.val<=parent.val
parent.val<=right.val
平衡二叉树(AVL)
- 可以是空树。
- 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1
哈弗曼树
- 是一种带权路径长度最短的二叉树,也称为最优二叉树。
- 带权路径长度达到最小,就是最优二叉树
- 由权值为9,5,2,7的四个叶子节点构造一棵最优二叉树,该树的带权路径长度为:44
线索二叉树
一个有n个结点的二叉链表。每一个结点有指向左右孩子的两个指针域,一共是2n个指针域。n个结点的二叉树一共同拥有n-1条分支线(根结点无前驱),存在2n-(n-1)=n+1个空指针域
将指向前驱和后驱的指针称为线索,加上线索的二叉链表则称为线索链表;加上线索的二叉树称为线索二叉树(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个空指针域被利用
将这棵二叉树的所有空指针域中的lchild,改为指向当前结点的前驱。H的前驱是NULL(①),I的前驱是D(②),J的前驱是B(③),F的前驱是A(④),G的前驱是C(⑤)。一共5个空指针域被利用,正好和上面的后继加起来是11个
线索二叉树,等于是把一棵二叉树转变成了一个双向链表,对插入删除结点、查找某个结点都带来了方便。
对二叉树以某种次序遍历使其变为线索二叉树的过程称做是线索化
空心箭头实线为前驱,虚线黑箭头为后继
每个结点再增设两个标志域ltag和rtag,ltag和rtag只是存放0或1数字的布尔型变量,占用的内存空间要小于像lchild和rchild的指针变量
- ltag为0时指向该结点的左孩子,为1时指向该结点的前驱
- rtag为0时指向该结点的右孩子,为1时指向该结点的后继