當我運行我的 TreeNode 代碼時,編譯器說由 countUnivalSubtrees 方法呼叫的 TreeNode 為空。但是,當我運行除錯模式時,它告訴我我創建的 Treenode 不為空。Treenode 類的物件傻瓜棒有它的根、左分支和右分支。那么為什么在呼叫fullowbar的時候,方法接收到的是一個空物件呢?
1.樹節點代碼
package lc_250;
public class TreeNode {
int val;
TreeNode root;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
public void put(int val){
this.root = put(this.root, val);
}
private TreeNode put(TreeNode node_now, int val){
if (node_now == null) return new TreeNode(val);
else if (val < node_now.val) node_now.left = put(node_now.left, val);
else if (val > node_now.val) node_now.right = put(node_now.right, val);
else node_now.val = val;
return node_now;
}
public static void main(String[] args) {
TreeNode foolbar = new TreeNode(3);
foolbar.put(5);
foolbar.put(6);
foolbar.put(3);
foolbar.put(2);
foolbar.put(4);
foolbar.put(9);
foolbar.put(8);
foolbar.put(7);
cson250 foolclass = new cson250();
int num = foolclass.countUnivalSubtrees(foolbar);
}
}
- cson250 代碼
package lc_250;
public class cson250 {
public int num = 0;
public int countUnivalSubtrees(TreeNode root) {
count(root);
return num;
}
public boolean count(TreeNode root){
if (root == null) System.out.println("bro Treenode is null");
boolean left = count(root.left);
boolean right = count(root.right);
if ( root.left == null && root.right == null){
num ;
return true;
}
if (left&&right){
if (root.left!=null && root.left.val != root.val){
return false;
}
if (root.right!= null && root.right.val != root.val){
return false;
}
num ;
return true;
}
return false;
}
}
uj5u.com熱心網友回復:
您在除錯器中顯示了與發生 NPE 的位置不同的點。這就是您觀察的欄位不顯示的原因root == null
。
在樹的每一片葉子中,root
將null
是首先在您的方法中檢查左側節點count
),您將首先執行
if (root == null) System.out.println("bro Treenode is null");
但隨后您的代碼繼續執行
boolean left = count(root.left);
并且NullPointerException
發生了,因為root
當然仍然存在null
,因此您無法訪問root.left
.
所有防止遞回呼叫的檢查都發生在呼叫之后,因此它們并不能真正幫助停止訪問 a root
that is null
。
uj5u.com熱心網友回復:
我建議,如果你想在除錯模式下看到你的樹節點為空,讓你的代碼看起來像這樣,以便在 root == null 時放置除錯點。
public boolean count(TreeNode root){
if (root == null)
System.out.println("bro Treenode is null");
這樣,您將在程式流程中的某個時刻看到您的根為 null。您可以在列印 System.out.println("bro Treenode is null"); 的行放置一個除錯點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/460885.html