二叉树的构建是一个常常考察的内容,有关二叉树的题目一般是使用递归方法解决,但是找到合适的递归方程很关键。
前序遍历:先看根节点,然后是左子树,最后是右子树。
中序遍历:先看左子树,然后是根节点,最后是右子树。
后序遍历:先看左子树,然后是右子树,最后是根节点。
前序: 根左右,可以根据这个结构先确定根的值,和位置。就是序列的第一个值
中序:左根右
后序:左右根, 可以根据序列判别树的根节点的值和位置。也就是后序序列最后一个值。
接下来列出前+中构建二叉树的Python代码实现:
class Node:
def __init__(self, data, left, right):
self.data = data
self.left = left
self.right = right
def construct_tree(pre_order, mid_order):
# 忽略参数合法性判断
if len(pre_order) == 0:
return None
# 前序遍历的第一个结点一定是根结点
root_data = pre_order[0]
i = mid_order.index(root_data) # 取出mid_order中根节点位置,左边的是左子树,右边的是右子树
# 递归构造左子树和右子树
left = construct_tree(pre_order[1: 1 + i], mid_order[:i]) # pre_order里其余元素都在i后,所以前序中只有根节点一个在左子树;mid_order里左子树元素都在i左边
right = construct_tree(pre_order[1 + i:], mid_order[i + 1:]) # pre_oder里其余元素都在i后,所以中序中其余节点都在右子树;mid_order里右子树元素都在i右边
return Node(root_data, left, right)
中+后生成二叉树: Leetcode 106.
# 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 buildTree(self, inorder, postorder):
"""
:type inorder: List[int]
:type postorder: List[int]
:rtype: TreeNode
"""
if not postorder:
return None
root = TreeNode(postorder[-1]) # 后序最后一个节点是根节点
n = inorder.index(root.val) # 取出中序中根节点的index,可以快速判别左右子树
root.left = self.buildTree(inorder[:n], postorder[:n]) # 在中序中,根节点的左子树元素都在左边;在后序中,根节点的右子树元素也都在左边
root.right = self.buildTree(inorder[n+1:], postorder[n:-1]) # 在中序中,根节点的右子树元素都在右边;在后序中,也都在左边,但是就不取最后一个元素了,因为最后一个是根
return root
加油!!