一、二叉树
二叉树:二叉树是n(n>=0)个结点的有限集合,它或为空(n=0), 或是由一个根及两棵互不相交的左子树和右子树组成,且树中左子树和右子树也均为二叉树;二叉树可以是空集合, 左子树 、右子树也可以为空
二叉树的特点:
- 二叉树可以是空的,称空二叉树;
- 每个结点最多只能有两个孩子;
- 子树有左、右之分且次序不能颠倒;
二叉树具有下列重要性质:
- 在二叉树的第i(i>=1)层上至多有2^(i-1)个 结点。
- 深度为k(k>=1)的二叉树至多有(2^k)-1个 结点,最少有k个节点
- 对任何一棵二叉树,如果其终端结点数为n0(叶子节点n0个),度为2的结点数为n2;则n0=n2+1。 即:叶结点数n0=度为2的结点数+1
二叉查树的遍历方式:
- 中序遍历:左->根->右 2、5、6、7、10、14、17、18、19
- 先序遍历:根->左->右 10、6、5、2、7、 14、18、17、19
- 后续遍历:左->右->根 2、5、7、6、17、19、18、14、10
- 层次遍历:层次遍历类似图的广度优先遍历(BFS) 10、6、14、5、7、18、2、17、19
二、满二叉树
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,深度为k(k>=1)且有(2^k)-1个结点的二叉树就是满二叉树
满二叉树的性质:
- 一个层数为k的满二叉树总结点数为:2^k-1,因此满二叉树的结点个数一定是奇数;第i层上的结点数为:2^(i-1)
- 一个层数为k的满二叉树的叶子结点个数(也就是最后一层):2^(k-1)
- 满二叉树的结点要么是叶子结点,度为0,要么是度为2的结点,不存在度为1的结点
三、完全二叉树
完全二叉树:深度为K的二叉树中,K-1层结点数是满的2^(k-2),K层结点是左连续的(即结点编号是连续的);高度为h(h>=2)的完全二叉树至少有2^(h-2)个叶子结点。
完全二叉树的性质:
- n个结点的完全二叉树的深度为:[log2n]+1([ ]表示向下取整)
- 如果对一棵有n个结点的完全二叉树的结点按层序编号, 则对任一结点i (1≤i≤n) 、
- 如果i=1, 则结点i是二叉树的根, 无双亲;如果i>1, 则其双亲结点是[i/2]
- 如果2*i>n, 则结点i无左孩子, 否则其左孩子是结点2*i
- 如果2*i+1>n, 则结点i无右孩子, 否则其右孩子是结点2*i+1
满二叉树是完全二叉树的特殊形态, 即如果一棵二叉树是满二叉树, 则它必定是完全二叉树
四、二叉树的存储
1、顺序存储:利用数组
如图:完全二叉树的顺序存储我们只需需要至上而下,至左而右给各个节点编号,该编号就是元素在数组中的索引;
如图非完全二叉树:我们需要增加虚拟节点,如果一个高度为h并且节点个数也是h的右支树,却需要2^h-1个存储空间, 所以该存储方式比较浪费空间
2、链式存储:利用链表
如图:二叉链表表示法 ,二叉链表,只能由父节点推导子节点,不能逆向
如图:三叉链表表示法,三叉链表相较于二叉链表,多了一个指向双亲的指针域,增加了空间但是对于树的操作来说更加灵活。