定义:
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树
性质1:在二叉树的第i层上最多有2^i-1个结点(i>=1)
这个不用多说,满二叉树,第一层1个结点,第二层2个结点,第三层4个
性质2:深度为K的二叉树最多有(2^k)-1个结点(k>=1),最少K个结点
这个就是1+2+4+..,一个等比求和,求出来的结果就是(2^k)-1
性质3:对任何一个二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0 = n2 + 1
证明:总边数B=结点数n - 1
度为2的结点产生2条边,度为1的结点产生一条边,所以有:
总边数B = n2 x 2 + n1 x 1,因为两个总边数相等,所以有:n = n2 x 2 + n1 x 1 + 1
又因为总结点数n = n2 + n1 + n0,所以有n2 x 2 + n1 x 1 + 1 = n2 + n1 + n0,可以得出n0 = n2 + 1
性质4:具有n个结点的完全二叉树的深度为
以2为底,值为n的对数,取底,然后再+1.假设一个完全二叉树有9个结点,那么可以计算出他的深度为:2为底9的对数为3.08,取底为3,再加上1,等于4
性质5:一个完全二叉树,对从1开始对每个结点进行编号(按从上到下,从左至右的规则)
如果i = 1,说明是根结点.如果i > 1,那么其双亲是结点 i/2 取底
结点编号为i,那么他的左孩子结点为2i,右孩子结点为2i+1
二,关于二叉树的存储,可以顺序存储和链式存储
1:顺序存储
顺序存储就是把二叉树,按满树的形式,对每个结点进行编号,然后可以把编号当作数组的下标,对数组进行赋值,查找等操作.
那么这个二叉树就可以用数组的形式来表示:BT[0, a, b, c, d, e, f, g........o]
如果这个二叉树不是满树,那没有数据的结点就为空或者0.比如:
那么我们这个二叉树的表示就为:BT[a, b, c, 0, d, e, 0],这样做,我们就可以根据数据内存还原出这个二叉树,也方便我们以后的操作.但是,由于除了满树和完全树,别的一些树空间浪费比较多,失去了数组存储的优势,所以就有了链式存储
二:链式存储
1:二叉链
创建一个结构体,包含数据域data,两个指针域lchild,rchild,分别指向自己的孩子
typedef struct BinaryTree
{ int data;
struct BinaryTree* lchild;
struct BinaryTree* rchild;
}BT;
没错,这就是一个自己包含自己的递归型数据,有点像广义表了.如果实际操作当中,要经常对双亲结点进行访,那么就有了下面的三叉链.
2:三叉链
创建一个结构体,包含数据域data,三个指针域lchild,rchild, parent,分别指向自己的孩子和双亲
typedef struct BinaryTree
{ int data;
struct BinaryTree* lchild;
struct BinaryTree* rchild;
struct BinaryTree* parent;
}BT;