【问题标题】:What is the difference between these two answer?这两个答案有什么区别?
【发布时间】:2015-09-18 09:39:27
【问题描述】:

我完成了一个问题“平衡二叉树”,这是我编写的两个版本。第一个是接受的,另一个是失败的。不同的是“+1”的位置,当我把它放在return语句中时,算法通过了。

但是为什么我不能把它放在赋值语句中呢?

失败的测试用例是这个:

输入:[1,2,2,3,null,null,3,4,null,null,4] 输出:真 预期输出:假 (我不知道这个数组是怎么变成二叉树的。)

二叉树节点的定义。

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode (int x) { val = x;}
}

以下是算法:

public boolean isBalanced(TreeNode root) {
    if(depth(root) == -1)
        return false;
    else return true;
}

// algorithm 1
private int depth(TreeNode root) {
    if(root == null)
        return 0;
    int leftdepth = depth(root.left);
    int rightdepth = depth(root.right);
    if(leftdepth == -1 || rightdepth == -1 || (Math.abs(leftdepth - rightdepth) > 1))
        return -1;
    else
        return Math.max(leftdepth,rightdepth) + 1;

// algorithm 2
private int depth(TreeNode root) {
    if(root == null)
        return 0;
    int leftdepth = depth(root.left)+1;
    int rightdepth = depth(root.right)+1;
    if(leftdepth == -1 || rightdepth == -1 || (Math.abs(leftdepth - rightdepth) > 1))
        return -1;
    else
        return Math.max(leftdepth,rightdepth);
}

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    因为您将这些值与 -1 进行比较。如果您愿意,第一个算法将与第二个算法相同:

    if(leftdepth == 0 || rightdepth == 0 ...
    

    【讨论】:

    • -1比较是为了保证两个分支是平衡的。
    • 是的,但是因为代码已经添加了 1,所以魔法值不再是 -1,而是 0。也许我错过了什么......
    • 不,你并没有错过什么——你是对的。我错过了这一点。
    【解决方案2】:

    算法 1 是正确的,因为分支的深度是其子分支的深度加上 1(此节点)的总和。

    算法 2 不正确,因为它将null 节点的深度记录为1

    【讨论】:

      猜你喜欢
      • 2018-01-13
      • 2012-06-12
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多