剑指Offer--(5)重建二叉树


title: 剑指Offer--(5)重建二叉树

categories: 算法与数据结构

tags: 数据结构


题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

解题思路和概念

  1. 前序遍历:根节点》左子树》右子树
  2. 中序遍历:左》根》右
  3. 后续遍历:左》右》根
  4. 递归和循环两种实现方法
  5. 宽度优先遍历:一层一层按照根》左》右的顺序执行遍历
  6. 二叉搜索树:左子树总是小于或等于根节点,右子树总是大于或等于根节点。
  7. 堆:最大堆中根节点的值最大,最小堆中根节点的值最小
  8. 红黑树:把树的节点定义为两个颜色,并通过规则确保从根节点到叶节点 的最长路径不超过最短路径的两倍。
  9. 主要的解题思路还是使用递归完善左右子树的结构。
# -*- 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):
        # write code here
        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:tin.index(pre[0])+1],tin[:tin.index(pre[0])])
            res.right = self.reConstructBinaryTree(pre[tin.index(pre[0])+1:],tin[tin.index(pre[0])+1:])
            return res

其他解法


class Solution:
    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

使用list.pop()可以在使用完该数据之后删除该数据。

你可能感兴趣的:(剑指Offer--(5)重建二叉树)