根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:3
/ \
9 20
/ \
15 7
前序中的第一个节点是整棵树的根节点,如果有左子树的话,前序遍历的第二个节点是左子树的根节点,根据根节点在中序遍历的位置,确定左子树的节点个数,从而确定右子树的根节点在前序遍历中的位置,最后,对根节点赋值,递归建树。
start为子树在中序中的最左边的下标,end为子树在中序中最右边的下标,r为子树根节点在前序中的下标
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def build(self, r,start,end, preorder,inorder):
# 注意递归结束条件
if start>end:
return
i=start
while i<=end and preorder[r]!=inorder[i]:
i+=1
root=TreeNode(0)
root.left=self.build(r+1,start,i-1, preorder,inorder)
root.right=self.build(r+1+i-start,i+1,end, preorder,inorder)
root.val=preorder[r]
return root
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if not preorder or not inorder:
return None
root=self.build(0,0,len(preorder)-1,preorder,inorder)
return root
解法二:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
if not pre or not tin:
return None
root=TreeNode(pre.pop(0))
index=tin.index(root.val)
root.left=self.reConstructBinaryTree(pre,tin[:index])
root.right=self.reConstructBinaryTree(pre,tin[index+1:])
return root
# write code here
给出一棵二叉树的先序和中序数组,通过这两个数组直接生成正确的后序数组。
输入描述:
第一行一个整数 n,表示二叉树的大小。 第二行 n 个整数 a_i,表示二叉树的先序遍历数组。 第三行 n 个整数 b_i,表示二叉树的中序遍历数组。
输出描述:
输出一行 n 个整数表示二叉树的后序遍历数组。
示例1
输入
3 1 2 3 2 1 3
输出
2 3 1
题目来源:https://www.nowcoder.com/practice/5ae5174f17674e458028ce12bc8bfe0b?tpId=101&&tqId=33248&rp=1&ru=/activity/oj&qru=/ta/programmer-code-interview-guide/question-ranking
参考:https://www.liuchuo.net/archives/2087
n = int(input())
preorder = list(map(int, input().split()))
inorder = list(map(int, input().split()))
def post(r, start, end, preorder, inorder, res):
if start > end:
return
i = start
while i <= end and inorder[i] != preorder[r]:
i += 1
post(r + 1, start, i - 1, preorder, inorder, res)
post(r + 1 + i - start, i + 1, end, preorder, inorder, res)
res.append(preorder[r])
res = []
post(0, 0, n - 1, preorder, inorder, res)
print(" ".join(str(i) for i in res))
简化代码
n = int(input())
preorder = list(map(int, input().split()))
inorder = list(map(int, input().split()))
def post(r, start, end, preorder, inorder, res):
if start > end:
return
i = inorder.index(preorder[r])
post(r + 1, start, i - 1, preorder, inorder, res)
post(r + 1 + i - start, i + 1, end, preorder, inorder, res)
res.append(preorder[r])
res = []
post(0, 0, n - 1, preorder, inorder, res)
print(" ".join(str(i) for i in res))