python按照层序遍历建立二叉树(详细注释)

       按照层序遍历建树是树的基本操作之一。通常用创建队列,逐层加入元素检查某层是否满,直到发现空位置的方法解决。本代码增加一种输入’#'字符的情况,表明该节点存储的数据为空。

#构造二叉树并实现访问操作,输入#代表树中相应节点的数据是none
#本题的二叉树是用层序构建的

#节点类
class Node():
    def __init__(self,elem = 0):
        #节点存储的数据,加_以便【用property添加私有属性】
        self._elem = elem
        #左孩子
        self.lchild = None
        #右孩子
        self.rchild = None
    #property创建类中的_elem变量的一个属性:
    #如果elem存储#字符,那么节点虽然存在,但存储数据是空;否则,elem就存储输入的数据
    @property
    def elem(self):
        if self._elem is '#':
            return None
        return self._elem
#二叉树类,包含添加元素和判断树是否存在的功能
class Mytree():
    """初始化二叉树。没有输入根节点数据就建立空根节点,有输入就建立相应数据的根节点"""
    def __init__(self,root = None):
        self.root = root
    #为树添加节点,传入参数为普通数据
    def add(self, elem):
        #将输入转化为节点,便于连接
        node = Node(elem)
        # 如果树根是空的,把这个节点放在根
        if self.root == None:
            self.root = node
        #树不空,需要逐层从左向右遍历,直到找到空位置插入。
        else:
            #创建一个队列,队列元素是节点。
            queue = [self.root]
            #如果这个队列中有东西,就要检查这里面的左右孩子节点是不是空的,如果不空的话加入队列中
            while queue:
                # 每次操作的循环只弹出队列第一个元素,检查。
                #在还未遍历完某层时,后一个弹出元素是第一个弹出元素的右侧节点。
                #遍历完某层、确定这层的节点都非空后,才会从队列弹出下一层的节点。
                #检查节点时,先检查这个节点是不是空,顺便将左右孩子加入队列。
                #以便以后发现当前检查的层的节点全部非空时可以通过队列进入下一层。
                cur = queue.pop(0)
                #当前节点左孩子为空,待插节点就安在左孩子
                if cur.lchild == None:
                    cur.lchild = node
                    #插入完成,不可继续执行,退出函数
                    return
                #左孩子不空,如果右孩子空,待插节点就安在右孩子
                elif cur.rchild == None:
                    cur.rchild = node
                    #插入完成,不可继续执行,退出函数
                    return
                #上两步都没有return,说明左右都不空。
                #此时需将当前位置节点左右孩子先后加入队列中等待判断。
                else:
                    queue.append(cur.lchild)
                    queue.append(cur.rchild)
                

#测试
if __name__=='__main__':
    MyTree = Mytree()
    #输入层序遍历的列表,有'#'不转化成int类型。
    lista = list(input().split())
    #逐个将列表元素插入到树中
    for i in range(len(lista)):
        MyTree.add(lista[i])
#检测程序,N为检测操作语句的数量
N = int(input())
for i in range(N):
     #每次输入一个python语句,eval用来执行,输入n次
     eval(input())

测试结果:
在这里插入图片描述

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值