劍指offer【7】:重構二叉樹,遞歸思路

思路:最終是要重構二叉樹;
1. 確定子樹的根節點:遞歸(當前子樹根在前序中的索引,left,right)每層傳入根節點在前序遍歷的索引;在中序遍歷中拿到根節點的索引,建立 當前子樹的根節點
2. 確定當前子樹的左節點:遞歸(左子樹的根節點在前序索引, left, 當前根在中序索引-1)
3. 確定當前子樹的右節點:遞歸(右子樹的根節點在前序索引, 當前根在中序索引+1, right)
其他:爲了方便查詢中序中節點的索引,建立map(節點:idx)

建立遞歸思路:
遞歸結束:子樹的左邊界idx > 子樹右邊界
遞推過程:當前遞歸層建立root
返回:返回當前層根節點作爲上一層的左或右節點

class Solution:
    # 思路:最終是要重構二叉樹;
    #   1. 確定子樹的根節點:遞歸(當前子樹根在前序中的索引,left,right)每層傳入根節點在前序遍歷的索引;在中序遍歷中拿到根節點的索引,建立當前子樹的根節點
    #   2. 確定當前子樹的左節點:遞歸(左子樹的根節點在前序索引, left, 當前根在中序索引-1)
    #   3. 確定當前子樹的右節點:遞歸(右子樹的根節點在前序索引, 當前根在中序索引+1, right)
    #   其他:爲了方便查詢中序中節點的索引,建立map(節點:idx)
    #   建立遞歸思路:
    #       遞歸結束:子樹的左邊界idx > 子樹右邊界
    #       遞推過程:當前遞歸層建立root
    #       返回:返回當前層根節點作爲上一層的左或右節點
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        
        self.pre, self.map_in= preorder, {}
        for i in range(len(inorder)): # 給中序建立索引
            self.map_in[inorder[i]] = i
        return self.recur(0, 0, len(inorder)-1)

    def recur(self, root_idx_pre, left, right):
            if left > right:
                return
            root = TreeNode(self.pre[root_idx_pre])  # 建立當前子樹的根節點
            root_idx_in = self.map_in[self.pre[root_idx_pre]]
            root.left = self.recur(root_idx_pre+1, left, root_idx_in-1)
            root.right = self.recur(root_idx_in - left + root_idx_pre + 1, root_idx_in+1, right)
            return root  # 返回根節點作爲上一層的左或右節點

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章