开始前建议先食用:
1. 思路
考点:
① 通过二叉树的前序和中序来构建二叉树
② 分治(递归):递归根节点的左右子树,将问题规模逐渐减小。
# -*- 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 not pre or not tin: # 递归的基线条件
return None
if len(pre) != len(tin): # 参数异常情况
return None
root_Node = TreeNode(pre[0]) # 用先序值列表的第一个值创建一个根节点
root_position = tin.index(pre[0]) # 看根节点的值在中序列表中的位置
tin_left_subtree_val = tin[:root_position] # 在中序列表中左子树的值
tin_right_subtree_val = tin[root_position+1:] # 在中序列表中右子树的值
pre_left_subtree_val = pre[1:root_position+1] # 在前序列表中左子树的值
pre_right_subtree_val = pre[root_position+1:] # 在前序列表中右子树的值
# 通过分治,将问题规模逐渐减小,递归栈的顶部一定是个叶子结点,它的左右孩子均为None
leftNode = self.reConstructBinaryTree(pre_left_subtree_val, tin_left_subtree_val)
rightNode = self.reConstructBinaryTree(pre_right_subtree_val, tin_right_subtree_val)
# 连接成树
root_Node.left = leftNode
root_Node.right = rightNode
return root_Node