一、已知二叉树的前序排列,中序排列 求后续排列。
# 已知二叉树前中序,求后序
pre = [1, 2, 3, 4, 5, 6, 7]
mid = [3, 2, 4, 1, 6, 7, 5]
pos = [3, 4, 2, 7, 6, 5, 1]
首先我们知道前序(先序)遍历为:根左右,中序遍历为:左根右,后序遍历为左右根。
我们根据先序遍历可以求出二叉树的根为1,然后来到中序遍历 根据 先序求出的根可以把树分为左子树 3,2,4 右子树6 ,7,5。然后我们可以看出这是一个递归问题,一次对左右子树递归即可。求后序,依次打印左右根。最后可以得到如下图所示的树:
pre = [1, 2, 3, 4, 5, 6, 7]
mid = [3, 2, 4, 1, 6, 7, 5]
def lx_pos(root, start, end):
if start > end: return
ind = start
while ind < end and mid[ind] != pre[root]:
ind += 1
# 找到根节点后
lx_pos(root + 1, start, ind - 1) # 遍历左子树
lx_pos(root + ind - start + 1, ind + 1, end) # 遍历右子树
print(mid[ind], end=' ')
print("后序是:")
lx_pos(0, 0, 6)
二、已知后中求前序
我们了解上面内容之后,不难看出中序遍历就像是一个枢纽,连接着前序和后续故代码如下:
def lx_pr(root, start, end):
if start > end: return
ind = start
while ind < end and mid[ind] != pos[root]:
ind += 1
print(mid[ind], end=' ')
lx_pr(root - (end - ind + 1), start, ind - 1)
lx_pr(root - 1, ind + 1, end)
print('前序是:')
lx_pr(6, 0, 6)
三、已知前序,中序,做镜面翻转 并且求层序。
在这里显然我们需要去根据前中序构建二叉树,然后遍历二叉树求层次遍历。
对于镜面翻转只是我们通常遍历从左往右,改为从右往左即可。
构建二叉树代码如下:(代码为pta 玩转二叉树python代码)
nums = int(input())
mid = list(map(int, input().split()))
pre = list(map(int, input().split()))
#结点类
class Node():
def __init__(self, item):
self.item = item
self.left = None
self.right = None
#构建树
class Tree():
def __init__(self):
self.root = None
#根据先序,中序遍历构建二叉树
def buildTree(self, pre_order, in_order):
if not pre_order:
return None
root = Node(pre_order[0])
root_index = in_order.index(pre_order[0])
root.left = self.buildTree(pre_order[1:root_index+1], in_order[:root_index])
root.right = self.buildTree(pre_order[root_index+1:], in_order[root_index+1:])
return root
#层序遍历
def travel(self, root):
if root is None:
return []
l = []
q = []
q.append(root)
while q:
point = q.pop(0)
l.append(point.item)
#调换两个if语句的位置即可改变遍历的左右顺序。
if point.right:
q.append(point.right)
if point.left:
q.append(point.left)
return l
#测试
a = [1,2,4,8,9,5,3,6,7]
b = [8,4,9,2,5,1,6,3,7]
t = Tree()
root = t.buildTree(pre, mid)
res = t.travel(root)
print(' '.join(map(str, res)))