劍指Offer -- 重建二叉樹(清晰思路)

題目描述:數組

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。spa

例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。指針

 

先貼上完整代碼:code

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     
12     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
13         
14        return reconstructBinaryTree(pre, 0, pre. length, in, 0, in.length);
15     }
16     
17   
18     private TreeNode reconstructBinaryTree(int [] pre, int preStart, int preEnd, int [] in, int inStart, int inEnd) {
19         
20         if(inStart == inEnd)
21             return null;
22         
23         TreeNode curRoot = new TreeNode(pre[preStart]);
24         
25         for(int i = inStart; i < inEnd; i++) { 
26             if (in[i] == pre[preStart]) {
27                 curRoot.left = reconstructBinaryTree(pre, preStart+1, preStart+i-inStart+1, in, inStart, i);
28                 curRoot.right = reconstructBinaryTree(pre, preStart+i-inStart+1, preEnd, in, i+1, inEnd);
29                 break;
30             }                                           
31         }
32         
33         return curRoot;  
34     }
35 }

 

思路:這題不難想到要用遞歸,難點是寫遞歸時的一些細節,主要有2點:blog

1,對當前節點的左右子樹遞歸時實參如何寫?遞歸

2,遞歸結束條件如何寫?it

 

對於問題1:io

只要把握前序是根左右,中序是左根右便可寫出,咱們知道對左子樹遞歸時傳入的是左子樹的前序數組和中序數組,那麼四個位置實參就應該是class

(preStart+1, preStart+i-inStart+1, inStart, i), preStart+1不難理解,前序是根左右嘛,那麼preStart+1確定是當前樹的左子樹的前序數組的起始位置, 接着左子樹前序數組的結尾index怎麼寫呢?咱們只要知道了左子樹中節點個數,那麼當前preStart+節點個數+1就是結束index了(個人寫法是數組包含起始指針,不包含結束指針),又由於中序遍歷是左根右,因此節點個數等於 i  - inStart,其中i是當前根節點在當前中序數組中的index,因此左子樹的結尾index即 preStart+i-inStart+1,同理能夠寫出其它位置參數,二叉樹

 

對於問題2:

能夠想出子樹中沒有節點時就能夠直接return null了,而子樹中節點的個數就等於遞歸時傳入的 前序數組的結束index - 前序數組的起始index = 中序數組的結束index - 中序數組的起始index , 由於2個同樣,因此只要拿一個來判斷就好了,如if (inEnd - inStart <= 0) return null;  可是其實寫 if (inEnd - inStart == 0)  就行,由於從剛纔寫出的位置參數能夠推出第一次不知足條件時子樹的節點個數必定爲0.

相關文章
相關標籤/搜索