利用前中遍歷重創二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例如給出:
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
輸出結果:
[3,9,20,null,null,15,7]

解答思路:

首先我們先來理一下思路如何根據前中遍歷,來構造二叉樹,這就不得不看一下前中遍歷的特點分別是什麼了

  1. 前序遍歷:【根節點|左子樹|右子樹】,也就是說【1,2,3】中,明確1是根,那麼2和3就是左右子樹,或者全在左子樹,或者全在右子樹。
  2. 中序遍歷:【左子樹|根節點|右子樹】,也就是說【1,2,3】中,明確1是根,那麼,2和3均在右子樹,明確2是根,那麼1在左子樹,3在右子樹
  3. 題目又說各節點值不同

根據前中遍歷特點,我們就容易得到規律:
前序遍歷中左子樹的第一個值爲根的左孩子,右子樹的第一個值爲根的右孩子;
前序遍歷中根的左孩子索引很容易就是在根的索引加一,但要得到根的右孩子,必須知道左子樹的長度,這就要用到中序遍歷來爲我們提供左右子樹的長度了

根據以上特點,可以按順序完成以下工作:

前序遍歷的首個元素即爲根節點 root 的值;
在中序遍歷中搜索根節點 root 的索引 ,可將中序遍歷劃分爲 [ 左子樹 | 根節點 | 右子樹 ] 。
根據中序遍歷中的左(右)子樹的節點數量,可將前序遍歷劃分爲 [ 根節點 | 左子樹 | 右子樹 ] 。


```python
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:        
        self.pre,self.ino=preorder,inorder
        return self.rt(0,0,len(inorder)-1)
        
    def rt(self,pre_rt,left,right):
        if left>right:
            return
        t_rt=TreeNode(self.pre[pre_rt])
        i=self.ino.index(self.pre[pre_rt])
        t_rt.left=self.rt(pre_rt+1,left,i-1)
        t_rt.right=self.rt(i-left+pre_rt+1,i+1,right)
        return t_rt 

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