关于二叉树以及对应的前序、中序、后序以及层次遍历

二叉树是一种常用的数据结构,其基本样式大概如下图所示,这里不做过多介绍:在这里插入图片描述
对于上图正常的一个满节点(以这棵树的根节点A为例),A为根节点、B为左节点、E为右节点,其他节点类似。二叉树遍历分为三种:前序、中序、后序,对于上面节点来说,前序顺序是ABE(根节点排最先,然后同级先左后右);中序顺序是BAE(先左后根最后右);后序顺序是BEA(先左后右最后根)。而对于整个树形结构,B表示的是以B为根节点下面对应的子树,同样E表示的是以E为根节点对应下面的子树,因此上图二叉树的遍历结果为:

  • 前序遍历:ABCDEFGHK
  • 中序遍历:BDCAEHGKF
  • 后序遍历:DCBHKGFEA

为了进一步说明上述遍历结果的由来,可以参考下面说明(以中序为例,其他两种类似):
在这里插入图片描述
对于一棵二叉树,其根节点课表示成如下方式:

'''
根节点表示方法
'''
class BiTreeNode:
    def __init__(self, data):
        self.data = data
        self.lchild = None #左孩子
        self.rchild = None #右孩子

对于上面的树结构,表示如下:

'''
所有的根节点
'''
a = BiTreeNode('A')
b = BiTreeNode('B')
c = BiTreeNode('C')
d = BiTreeNode('D')
e = BiTreeNode('E')
f = BiTreeNode('F')
g = BiTreeNode('G')
h = BiTreeNode('H')
k = BiTreeNode('K')
'''
各节点之间的关系
'''
a.lchild=b
a.rchild=e
b.rchild=c
c.lchild=d
e.rchild=f
f.lchild=g
g.lchild=h
g.rchild=k

利用递归的思想实现上述三种遍历,其中:

  • 前序遍历(根、左、右):
def pre_order(root):
    if root:
        print(root.data, end='')
        pre_order(root.lchild)
        pre_order(root.rchild)
  • 中序遍历(左、根、右):
def in_order(root):
    if root:
        in_order(root.lchild)
        print(root.data, end='')
        in_order(root.rchild)

后序遍历(左、右、根):

def post_order(root):
    if root:
        post_order(root.lchild)
        post_order(root.rchild)
        print(root.data, end='')

补充:层次遍历
层次遍历就是按照从上到下,从左到右的顺序遍历一棵树,对于上述树结构,层次遍历的结果为:ABECFDGHK。对于这种遍历可以采用队列(先入先出)的方式实现,先将根节点入队列,当队列不为空时,出队列一个,并把出队列的左右子节点放入队列中,重复上述过程。程序具体实现如下:

def level_order(root):
    q=deque()
    q.append(root)
    while len(q)>0:
        x=q.popleft()
        print(x.data,end='')
        if x.lchild:
            q.append(x.lchild)
        if x.rchild:
            q.append(x.rchild)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值