我正在对leetcode做一些问题并遇到以下问题:
Invert a binary tree:
4
/ \
2 7
/ \ / \
1 3 6 9
to
4
/ \
7 2
/ \ / \
9 6 3 1
我有解决方案但是我的代码不会只使用第一个return语句吗?第一个声明不会作为基本情况并且足够吗?为什么最后一个返回语句必须在那里?
public TreeNode invertTree(TreeNode root) {
if(root == null) {
return root;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
答案 0 :(得分:1)
您的实施会修改您收到的TreeNode
。
假设这是允许的,通常是不安全的。
你应该仔细检查要求,
如果没有明确提及,最好不要做出这样的假设。
method's signature需要返回TreeNode
。
意图可能是不修改输入树,
并返回一棵新的倒置树。
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode newRoot = new TreeNode(root.val);
newRoot.left = invertTree(root.right);
newRoot.right = invertTree(root.left);
return newRoot;
}
如果允许修改输入树,
那么方法签名会更好void
,
然后你的实现会很好,最后return
被删除。
答案 1 :(得分:1)
实际上并没有在递归中使用返回的TreeNode。
如果你:
void
(来自TreeNode
)你应该做同样的事情(但不返回输入的副本)。
答案 2 :(得分:1)
方法的所有可能出口点都必须有return语句。在public TreeNode invertTree(...)
定义中,您承诺始终返回TreeNode
。如果你省略了最后一个return语句,那么root != null
就会破坏你的承诺 - 因此编译器不会接受这样的代码。
答案 3 :(得分:1)
事实上,目前尚不清楚返回价值的目的是什么。它当然不需要算法,你不需要它来检索根treenode(因为你应该有它用于初始调用)。
所以你可以把它改成:
public void invertTree(TreeNode root) {
if(root == null) {
return;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
}
甚至,如果你特别反对return
s:
public void invertTree(TreeNode root) {
if(root != null) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
}
}
但只要该方法声明它返回一个值(即它不是void
方法),它应该在所有方法中都有一个最终return
(或throw
)语句其分支机构。
答案 4 :(得分:-1)
当您的方法签名返回TreeNode类型的对象时,编译器希望该方法返回可被视为TreeNode的内容。 我认为这是最后一次返回的原因,因为你可以返回null,你的方法将具有相同的行为。
public TreeNode invertTree(TreeNode root) {
if(root == null) {
return root;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
return null;
}