剑指offer_第4题_重建二叉树

题目描述

  • 输入某二叉树的前序遍历和中序遍历的结果
  • 请重建出该二叉树
    假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

理解

  • 二叉树的遍历(参考:二叉树遍历重建二叉树
    • 前序遍历(NLR)
      遍历顺序为(根-左-右),每次读取的第一个值一定是根节点,这样我们可以在中序遍历的序列中找到当前的根节点的位置。
    • 中序遍历( LNR)
      遍历顺序为(左-根-右),当确定了一个根节点后,其左边序列就是这个根节点的左子树,右边序列就是其右子树。
    • 后序遍历( LRN)
      遍历顺序为(左-右-根)

解题思路

思路1

  • 前序遍历的第一个值一定为根节点,对应于中序遍历中间的一个点。在中序遍历序列中,这个点左侧的均为根的左子树,这个点右侧的均为根的右子树。
  • 利用递归,分别取前序遍历[1:i+1]和中序遍历的[:i]对应与左子树继续上一个过程,取前序遍历[i+1:]和中序遍历[i+1:]对应于右子树继续上一个过程,最终得以重建二叉树。
  • i是中序序列中pre(0)所在位置,也就是中序序列中根的位置
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    def reConstructBinaryTree(self, pre, mid):
        if len(pre) == 0:
            return None
        if len(pre) == 1:
            return TreeNode(pre[0])
        else:
            res = TreeNode(pre[0])
            res.left = self.reConstructBinaryTree(pre[1: mid.index(pre[0]) + 1], mid[: mid.index(pre[0])])
            res.right = self.reConstructBinaryTree(pre[mid.index(pre[0]) + 1: ], mid[mid.index(pre[0]) + 1: ])
        return res

附其他人写的代码:

class Solution:
    def reConstructBinaryTree(self, pre, tin):
        if pre==[]:
            return None
        val = pre[0]
        idx = tin.index(val)
        ltin = tin[0:idx]
        rtin = tin[idx+1:]
        lpre = pre[1:1+len(ltin)]
        rpre = pre[1+len(ltin):]
        root = TreeNode(val)
        root.left = self.reConstructBinaryTree(lpre,ltin)
        root.right = self.reConstructBinaryTree(rpre,rtin)
        return root

猜你喜欢

转载自blog.csdn.net/Datawhale/article/details/81948283