python数据结构(二叉树遍历)

目录

二叉树的性质

二叉树存储

二叉树的遍历分为三种

先序遍历

中序遍历

后序遍历


二叉树的性质

性质1:二叉树第i层上的节点数目最多为2^{i-1}(i\geqslant1).

【证明】:数学归纳法证明。

归纳基础:i=1时,有2^{i-1}=2^{0}=1。因为第1层上只有一个根节点,所以命题成立。

归纳假设:假设对所有的j(1\leqslantj<i)命题成立,即第j层上至少有2^{j-1}个节点,证明j=i时命题亦成立。

归纳步骤:根据归纳假设,第i-1层上至多有2^{i-2}个节点。由于二叉树的每个节点至多有两个孩子,故第i层上的节点书至多是第i-1层上的最大节点数的2倍。即j=i时,该层上至多有2\times2^{i-2}=2^{i-1}个节点,故命题成立。


性质2:深度为k的二叉树至多有2^{k}-1个节点(k\geqslant1)。

【证明】:在具有相同深度的二叉树中,仅当每一层都含有最大节点数时,其数 中节点数最多。因此利用性质1可得,深度为k的二叉树的节点数至多为

        2^{0}+2^{1}+...+2^{k-1}=2^{k}-1

        故命题正确


性质3:在任意一颗二叉树中,若终端节点的个数为n_{0},度为2的节点个数为n_{2},则n_{0}=n_{2}+1。

【证明】:因为二叉树所有节点的度数均不大于2,所以节点总数(记为n)应等于0度节点数、1度节点(记为n_{1})和2度节点数之和:

                                                n=n_{0}+n_{1}+n_{2}

另一方面,1度节点有一个孩子,2度节点有两个孩子,故二叉树中孩子节点总数是:

                                                        n_{1}+2n_{2}

树中只有根节点不是任何节点的孩子,故二叉树中的节点总数又可表示为:

                                                n=n_{1}+2n_{2}+1

由式子1和式子2得到:n_{0}=n_{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     #输出根结点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值