【发布时间】:2020-09-17 04:28:59
【问题描述】:
我试图在 leetcode 上解决这个问题,通过查看我所写的内容,我认为我的逻辑是正确的,但我得到了相同的树作为输出,这是错误的。我有一个疑问,我可以不将树根的当前范围设置为 null 吗?在看到人们的解决方案后,他们使 root.left null 或 root.right null 不像我的根本身。
我是否在这里遗漏了一些基本概念。
链接到 LeetCode 问题:- https://leetcode.com/problems/binary-tree-pruning/
我的解决方案:-
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* 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;
* }
* }
*/
class Solution {
public TreeNode pruneTree(TreeNode root) {
cleanTree(root);
return root;
}
public boolean cleanTree(TreeNode root) {
if(root == null) {
return true;
}
boolean left = cleanTree(root.left);
boolean right = cleanTree(root.right);
if(root.val == 0 && left && right) {
root = null;
return true;
}
return false;
}
}
【问题讨论】:
-
“我有一个疑问,我不能将树的根设置为空” 既然没有要求您这样做,那为什么要担心呢?任务是“返回同一棵树,其中每个 subtree (给定树的)不包含 1 已被删除”。由于您只是删除子树,因此 根节点将始终保留。
-
您将
cleanTree()参数命名为root的事实令人困惑,因为大多数时候,该值不是树的根。pruneTree()的参数是“树的根”。cleanTree()的参数只是一些节点。 --- 你永远不应该将节点本身清空,你将left和right引用清空,然后返回true如果你希望 caller 清空对节点的引用. -
所以你在问为什么
root = null不会在调用者中取消root.left或root.right。答案在这里:Is Java “pass-by-reference” or “pass-by-value”?. -
@Andreas 谢谢你,现在我清楚地知道我错在哪里了。你完全清除了我对事情如何传递的怀疑
标签: java data-structures tree