leetcode105/剑指offer7.从前序与中序遍历序列构造二叉树/程序员代码面试指南.通过先序和中序数组生成后序数组

题目一:从前序与中序遍历序列构造二叉树

1.题目描述

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

2.解题思路

前序中的第一个节点是整棵树的根节点,如果有左子树的话,前序遍历的第二个节点是左子树的根节点,根据根节点在中序遍历的位置,确定左子树的节点个数,从而确定右子树的根节点在前序遍历中的位置,最后,对根节点赋值,递归建树。

start为子树在中序中的最左边的下标,end为子树在中序中最右边的下标,r为子树根节点在前序中的下标

3.代码实现

# 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

题目二:通过先序和中序数组生成后序数组

1.题目描述

给出一棵二叉树的先序和中序数组,通过这两个数组直接生成正确的后序数组。

输入描述:

第一行一个整数 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

2.解题思路

leetcode105/剑指offer7.从前序与中序遍历序列构造二叉树/程序员代码面试指南.通过先序和中序数组生成后序数组_第1张图片

参考:https://www.liuchuo.net/archives/2087

3.代码实现

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))

 

你可能感兴趣的:(leetcode,面试题,剑指offer)