二叉树
定义:
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;
一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。满二叉树肯定是完全二叉树,完全二叉树不一定是满二叉树。
1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;
2. 树的结点无左、右之分,而二叉树的结点有左、右之分。
逻辑上二叉树有五种基本形态:
空二叉树
只有一个根节点的二叉树
只有 左子树
只有右子完全二叉树
树的基本术语:
结点的度:结点拥有的子树的数目。
叶子:也叫终端结点,度为零的结点。
分支结点:度不为零的结点。
树的度:树中结点的最大的度。
层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。
树的高度:树中结点的最大层次。
无序树:如果树中结点的各子树之间的次序是不重要的,可以交换位置。
有序树:如果树中结点的各子树之间的次序是重要的, 不可以交换位置。
森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。
二叉树性质
(1) 在非空二叉树中,第i层的结点总数不超过
, i>=1;
(2) 深度为h的二叉树最多有
个结点(h>=1),最少有h个结点;
(3)
在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1
证明:因为二叉树中所有结点的度数均不大于2,所以结点总数(记为n)="0度结点数(n0)" + "1度结点数(n1)" + "2度结点数(n2)"。由此,得到等式一。
(等式一) n=n0+n1+n2
另一方面,0度结点没有孩子,1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总数是:n1+2n2。此外,只有根不是任何结点的孩子。故二叉树中的结点总数又可表示为等式二。
(等式二) n=n1+2n2+1
由(等式一)和(等式二)计算得到:n0=n2+1。原命题得证!
(4) 具有n个结点的完全二叉树的深度为
存储方式
顺序存储方式 链表存储方式
第一种,数组表示。用数组存储方式就是用一组连续的存储单元存储二叉树的数据元素
用下标就可以直接找到那个节点,也可以找这个节点的左孩子2n+1,右孩子2n+2.找父节点(n-1)/2
第二种,链表存储表示。其中又有二叉链表结构和三叉链表结构。
二叉链表里有leftchild指针,rightchild指针和数据。三叉链表里不仅有leftchild指针,rightchild指针和数据还有parent指针,能找 到父节点。
遍历
所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。
先序遍历
首先访问根,再先序遍历左子树,最后先序遍历右子树
中序遍历
首先中序遍历左子树,再访问根,最后中序遍历右子树
后序遍历
首先后序遍历左子树,再后序遍历右子树,最后访问根
层次遍历
即按照层次访问,通常用队列来做。访问根,访问子女,再访问子女的子女
1
2 3
4 5 6
7
这颗二叉树的前序遍历:1-2-4-5-7-3-6
中序遍历:4-2-5-7-1-6-3
后序遍历:4-7-5-2-6-3-1
层序遍历:1-2-3-4-5-6-7