Java數組判空的正確打開方式


今天在刷算法題的時候,有一道劍指offer上的題目:重建二叉樹,其中要先對給的兩個int型數組判空,但是測試發現我寫的判空方法不行,特此記錄

【劍指offer】重建二叉樹 --Java實現

遞歸構建二叉樹

1. 分析

根據中序遍歷和前序遍歷可以確定二叉樹,具體過程為:

  1. 根據前序序列第一個結點確定根結點
  2. 根據根結點在中序序列中的位置分割出左右兩個子序列
  3. 對左子樹和右子樹分別遞歸使用同樣的方法繼續分解

例如:
前序序列{1,2,4,7,3,5,6,8} = pre
中序序列{4,7,2,1,5,3,8,6} = in

    1. 根據當前前序序列的第一個結點確定根結點,為 1
    2. 找到 1 在中序遍歷序列中的位置,為 in[3]
    3. 切割左右子樹,則 in[3] 前面的為左子樹, in[3] 后面的為右子樹
    4. 則切割后的左子樹前序序列為:{2,4,7},切割后的左子樹中序序列為:{4,7,2};切割后的右子樹前序序列為:{3,5,6,8},切割后的右子樹中序序列為:{5,3,8,6}
    5. 對子樹分別使用同樣的方法分解

代碼如下 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;
}

我先記下來吧,以后最好都用這種判空,保險一些!原理還不太清楚,如果有知道的大佬,可以留言告知一下,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM