按照层序遍历建树是树的基本操作之一。通常用创建队列,逐层加入元素检查某层是否满,直到发现空位置的方法解决。本代码增加一种输入’#'字符的情况,表明该节点存储的数据为空。
#构造二叉树并实现访问操作,输入#代表树中相应节点的数据是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())
测试结果: