二叉樹的構建是一個常常考察的內容,有關二叉樹的題目一般是使用遞歸方法解決,但是找到合適的遞歸方程很關鍵。
前序遍歷:先看根節點,然后是左子樹,最后是右子樹。
中序遍歷:先看左子樹,然后是根節點,最后是右子樹。
后序遍歷:先看左子樹,然后是右子樹,最后是根節點。
前序: 根左右,可以根據這個結構先確定根的值,和位置。就是序列的第一個值
中序:左根右
后序:左右根, 可以根據序列判別樹的根節點的值和位置。也就是后序序列最后一個值。
接下來列出前+中構建二叉樹的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
加油!!