Java 實現劍指Offer 重建二叉樹
害 開頭還是來點題外話 今天下午不想做題了 準備把最近做的算法題整理一下 這裏的這篇文章依舊會參考不少的優秀代碼和博客 同時呢 也儘量多一些不一樣與衆不同的東西 加入自己的一丟丟思考(害 因爲是自己的思考 這部分如果有錯誤 希望大家指正) 下面開始正題
題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0){
return null;
}
int rootVal=pre[0];
if(pre.length==1){
return new TreeNode(rootVal);
}
int rootIndex=0;
TreeNode root=new TreeNode(rootVal);
for(int i=0;i<pre.length;i++){
if(in[i]==rootVal){
rootIndex=i;
break;
}
}
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));
root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
return root;
}
}
大致思路
這塊就不詳細說了 網上有好多優秀的博客再講這個 這也不是我想記錄這篇博客的重點 反正就是一直遞歸
自己的思考
自己呢對於這個遞歸的出口一直有些理解的不太到位 於是便放到eclipse上debug了一下 也算是有一點點收穫
import java.util.Arrays;
public class Demo1 {
public static void main(String[] args) {
Demo1 d=new Demo1();
int[] pre= {1,2,4,7,3,5,6,8};
int[] in= {4,7,2,1,5,3,6,8};
TreeNode tree=d.reConstructBinaryTree(pre, in);
}
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0){
return null;
}
int rootVal=pre[0];
if(pre.length==1){
return new TreeNode(rootVal);
}
int rootIndex=0;
TreeNode root=new TreeNode(rootVal);
for(int i=0;i<pre.length;i++){
if(in[i]==rootVal){
rootIndex=i;
break;
}
}
System.out.println(pre);
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));
root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
return root;
}
}
這個是我斷點位置(隨意加了一句話 在這裏斷點) 我們來看debug的結果
這是初始剛剛第一次進入reConstructBinaryTree這個函數的過程 找到了rootVal 找到了rootIndex 對應的pre數組和in數組如上圖所示
接下來 進入了第一次遞歸
我們看到這次遞歸rootVal變成了2 pre數組和in數組也有變化
接下來是一個小的遞歸出口
這個時候rootVa是4 當我們這一次在準備進入遞歸時 也就是當代碼執行到這句時
我們發現 這是的pre數組是[1,1)這樣的一個情況 也就是pre數組的長度爲0了 通過斷點我們也可以看到
這時的pre數組確確實實長度爲0 我們再往下理解
代碼執行到這裏 返回了一個null值那麼這個null值被返回到了那裏呢?
null值被返回到了這裏 也就是
root.left=null;//其實就是這個意思 這樣就把root.left執行完畢了
接下來的話 代碼又會進入root.right這部分繼續往下迭代 那麼又會找到新的pre數組和in數組 我這裏僅僅是舉了以4當root去找4的左子節點的一種小小的情況 當我們的pre數組長度爲1時 又會是新的一種不同的情況 這種情況會返回一個新創建的節點這裏也就不太再往下具體分析了 我覺得理解了null值這種情況 其他也是一樣的(寫到這裏累了其實是 害)
寫在最後
我覺得吧 很多人應該也看不到這裏 畢竟我覺得看這麼多 不如自己上手來一遍理解的透徹 害 希望大家都繼續努力啊