目录
二叉树的性质
性质1:二叉树第i层上的节点数目最多为(i1).
【证明】:数学归纳法证明。
归纳基础:i=1时,有==1。因为第1层上只有一个根节点,所以命题成立。
归纳假设:假设对所有的j(1ji)命题成立,即第j层上至少有个节点,证明j=i时命题亦成立。
归纳步骤:根据归纳假设,第i-1层上至多有个节点。由于二叉树的每个节点至多有两个孩子,故第i层上的节点书至多是第i-1层上的最大节点数的2倍。即j=i时,该层上至多有2=个节点,故命题成立。
性质2:深度为k的二叉树至多有个节点(k1)。
【证明】:在具有相同深度的二叉树中,仅当每一层都含有最大节点数时,其数 中节点数最多。因此利用性质1可得,深度为k的二叉树的节点数至多为
故命题正确
性质3:在任意一颗二叉树中,若终端节点的个数为,度为2的节点个数为,则=+1。
【证明】:因为二叉树所有节点的度数均不大于2,所以节点总数(记为n)应等于0度节点数、1度节点(记为)和2度节点数之和:
n=++
另一方面,1度节点有一个孩子,2度节点有两个孩子,故二叉树中孩子节点总数是:
+2
树中只有根节点不是任何节点的孩子,故二叉树中的节点总数又可表示为:
n=+2+1
由式子1和式子2得到:=+1
二叉树存储
顺序存储和链式存储
其中链式存储分为左指针和右指针其中中间为数据域
二叉树的遍历分为三种
先序遍历
先访问根结点,再访问左子树,最后访问右子树
def PreOrder(self,root):
if root == None:
return
print root.elem #输出根结点
self.PreOrder(root.lchild) #先序遍历左子树
self.PreOrder(root.rchild) #先序遍历右子树
中序遍历
先访问左子树,再访问根结点,最后访问右子树
def InOrder(self,root):
if root==None:
return
self.InOrder(root.lchild) #中序遍历左子树
print self.elem #输出根结点
self.Inorder(root.rchild) #中序遍历右子树
后序遍历
先访问左子树,再访问右子树,最后访问根结点
def PostOrder(self,root):
if root==None:
return
self.PostOrder(root.lchild) #后序遍历左子树
self.PostOrder(root.rchild) #后序遍历右子树
print root.elem #输出根结点