前置知识:二叉树的四种遍历方式:
有一二叉树如下图一所示:
通过以下四种遍历结果分别如下
一:先序遍历DLR(D为根,L为左节点,R为右节点)
1 2 4 3 5 6
二:中序遍历LDR
4 2 1 5 6 3
三:后续遍历
4 2 6 5 3 1
四:层序遍历
1 2 3 4 5 6
题目:
一个二叉树,树中每个节点的权值互不相同。
现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。
输入格式
第一行包含整数 N,表示二叉树的节点数。
第二行包含 N 个整数,表示二叉树的后序遍历。
第三行包含 N 个整数,表示二叉树的中序遍历。
输出格式
输出一行 N 个整数,表示二叉树的层序遍历。
数据范围
1≤N≤30,
官方并未给出各节点权值的取值范围,为方便起见,在本网站范围取为 1∼N。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
分析:
提示:后序遍历给出的根结点永远是在最后,中序遍历的根节点都是在中间。根左右边的结点总数不会变。
根据提示,我们可以想到先将树构建起来,然后对书进行层序遍历。
构建一个类node,有值、左结点、右节点。
class node():
lc = None
rc = None
va = None
构想一个函数,给入后续遍历与中序遍历的结果能自动返回根节点。
如下:
def find_t(a:list,b:list):
Node = node()
if a==[]:
return Node
Node.va = a.pop()
mid = b.index(Node.va)
Node.lc = find_t(a[:mid],b[:mid])
Node.rc = find_t(a[mid:],b[mid+1:])
return Node
最后只需要对返回的根节点进行层序遍历即可。
root = find_t(hx,zx)
l = [root]
while l!=[]:
if l[0].lc.va != None:
l.append(l[0].lc)
if l[0].rc.va != None:
l.append(l[0].rc)
print(l.pop(0).va,end = ' ')
本文结尾:
本文利用递归的结构对树进行重建,采用队列对树进行层序遍历。当然本题解法并不唯一,本解法性能也许并不好,欢迎各位提问。