Java 實現劍指Offer 重建二叉樹(遞歸出口)

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值這種情況 其他也是一樣的(寫到這裏累了其實是 害)

寫在最後

我覺得吧 很多人應該也看不到這裏 畢竟我覺得看這麼多 不如自己上手來一遍理解的透徹 害 希望大家都繼續努力啊

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