【二叉树】根据中序、后序构建二叉树,前序、中序构建二叉树
二叉树的构建是一个常常考察的内容,有关二叉树的题目一般是使用递归方法解决,但是找到合适的递归方程很关键。
前序遍历:先看根节点,然后是左子树,最后是右子树。
中序遍历:先看左子树,然后是根节点,最后是右子树。
后序遍历:先看左子树,然后是右子树,最后是根节点。
前序: 根左右,可以根据这个结构先确定根的值,和位置。就是序列的第一个值
中序:左根右
后序:左右根, 可以根据序列判别树的根节点的值和位置。也就是后序序列最后一个值。
接下来列出前+中构建二叉树的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
加油!!