反转二叉树时返回语句

时间:2017-03-14 21:56:02

标签: java algorithm recursion binary-tree

我正在对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;
}

5 个答案:

答案 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。

如果你:

  1. 删除最后一个返回语句AND
  2. 删除第一个返回语句AND
  3. 将方法签名更改为void(来自TreeNode
  4. 你应该做同样的事情(但不返回输入的副本)。

答案 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;
}