今天在刷算法題的時候,有一道劍指offer上的題目:重建二叉樹,其中要先對給的兩個int型數組判空,但是測試發現我寫的判空方法不行,特此記錄
【劍指offer】重建二叉樹 --Java實現
遞歸構建二叉樹
1. 分析
根據中序遍歷和前序遍歷可以確定二叉樹,具體過程為:
- 根據前序序列第一個結點確定根結點
- 根據根結點在中序序列中的位置分割出左右兩個子序列
- 對左子樹和右子樹分別遞歸使用同樣的方法繼續分解
例如:
前序序列{1,2,4,7,3,5,6,8} = pre
中序序列{4,7,2,1,5,3,8,6} = in
- 根據當前前序序列的第一個結點確定根結點,為 1
- 找到 1 在中序遍歷序列中的位置,為 in[3]
- 切割左右子樹,則 in[3] 前面的為左子樹, in[3] 后面的為右子樹
- 則切割后的左子樹前序序列為:{2,4,7},切割后的左子樹中序序列為:{4,7,2};切割后的右子樹前序序列為:{3,5,6,8},切割后的右子樹中序序列為:{5,3,8,6}
- 對子樹分別使用同樣的方法分解
代碼如下 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 import java.util.Arrays; 11 public class Solution { 12 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { 13 //思路: 14 //根據先序可以確定根節點pre[0],然后根據中序將整個樹分為左右子樹,最后分別對左右子樹在進行相同的方法,也就是遞歸即可
15 if( (pre.length == 0 ||pre==null ) || (in.length== 0|| in== null)){ 16 return null; 17 } 21 TreeNode res = new TreeNode(pre[0]); 22 for(int i=0;i< in.length;i++){ 23 //根據先序可以確定根節點pre[0],然后根據中序將整個樹分為左右子樹,最后分別對左右子樹在進行相同的方法,也就是遞歸即可 24 //如果找到了某一個中序的節點 25 if(in[i] == pre[0]){ 26 //Arrays.copyOfRange(array,from,to);復制數組范圍,包含from,但不包含to,也就是左閉右開 27 //左子樹 28 res.left = reConstructBinaryTree( 29 Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i) 30 ); 31 //柚子樹 32 res.right = reConstructBinaryTree( 33 Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length) 34 ); 35 break; 36 } 37 } 38 return res; 39 40 } 41 }
》這是我寫的判空,就是直接用是否等於null判斷的,發現會報以下錯誤:
if( pre==null || in== null) {
return null;
}
》而寫成下面這種用數組長度判斷的時候,不會報錯。
if
(pre.length ==
0
|| in.length ==
0
) {
return
null
;
}
》最終,我把兩種寫法合並,都進行判斷,寫成了下面的形式,也不會報錯,這就很奇怪。
if( ( pre.length == 0 || pre == null ) || (in.length == 0|| in == null)){
return null;
}
我先記下來吧,以后最好都用這種判空,保險一些!原理還不太清楚,如果有知道的大佬,可以留言告知一下,謝謝!