python二叉树的创建与遍历

二叉树的基本概念:

一个结点的层次直观上来说就是其所在的行,其中根结点层次为1(第一行),其子结点层次为2(第二行),以此类推

二叉树的深度(高度):指的是二叉树中的最大叶子结点所在的层。二叉树的深度=max(左子树深度,右子数深度)+1,可用递归的方式实现。

二叉树结点的度:指该结点分支的个数(0,1,2)

完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布

满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树

平衡二叉树(AVL):二叉排序树,空,或左子树和右子树都是平衡二叉树,且深度差<=1

性质:

(1) 在非空二叉树中,第i层的结点总数不超过, i>=1;

(2) 深度为h的二叉树最多有个结点(h>=1),最少有h个结点;

(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;度为1的结点数N1=N-N0-N2

(4) 具有n个结点的完全二叉树的深度为(注:[ ]表示向下取整)

(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:

若I为结点编号(编号从1开始)则 如果I>1,则其父结点的编号为I/2;

如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;

如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。

(若编号从0开始,设l为父节点编号,则其左儿子的编号为2*l + 1, 其右儿子的编号为2*l + 2)

二叉树的创建与遍历:

# /usr/bin/pyhton
#coding=utf-8
#
#author:yumianzhan

class Tree_node():
    def __init__(self, v = None, l = None, r = None):
        self.value = v
        self.left  = l
        self.right = r

#创建二叉树
def creat(root):
    a = input('Inter a key:')
    if a is '!':
        print(a)
        root = None
    else:
        root = Tree_node(v = a)
        root.left = creat(root.left)
        root.right = creat(root.right)
    return root

#前序遍历
def preorder(root):
    if root is None:
        return
    print(root.value)
    preorder(root.left)
    preorder(root.right)

#中序遍历
def inorder(root):
    if root is None:
        return
    inorder(root.left)
    print(root.value)
    inorder(root.right)

#后序遍历
def postorder(root):
    if root is None:
        return
    postorder(root.left)
    postorder(root.right)
    print(root.value)

#测试
def main():
    root = None
    root = creat(root)
    print(root)
    print('前序遍历:')
    preorder(root)
    print('中序遍历:')
    inorder(root)
    print('后序遍历:')
    postorder(root)

if __name__ == '__main__':
    main()

运行程序,建立二叉树如下:

前序遍历结果为: a  b  c  d  e  f

中序遍历结果为:c  b  d  a  f  e 

后序遍历结果为:c  d  b  f  e  a 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值