【问题标题】:Printing branches on a Binary Tree在二叉树上打印分支
【发布时间】:2016-10-07 00:07:20
【问题描述】:

你如何计算分支的数量,在这种情况下,分支是偶数。这是我到目前为止所拥有的。它似乎适用于几种情况。

public int evenBranches() {
    return evenBranches(overallRoot);
}

private int evenBranches(IntTreeNode root) {
    if (root == null) {
        return 0;
    } 
    int val = 0;
    if (root.left != null) {
        val += evenBranches(root.left);
    } else if (root.right != null) {
        val += evenBranches(root.right);
    }
    if (root.data % 2 == 0) {
        return val + 1;
    } else {
        return val;
    } 
}

【问题讨论】:

  • 题主“打印分支”没看懂?一定要“数数”吗?
  • “它似乎适用于几种情况。”那么哪些情况,我假设你已经找到了一个不适用的情况,就是那个?
  • 提示:这是学习单元测试的好机会。即使您不使用 JUnit,您可能仍然值得考虑编写一小段测试代码。您知道:就像生成具有已知布局的专用树,然后在其上运行您的代码并检查返回的数字。从小例子开始,当出现问题时,您可以在调试器中运行该测试。这就是你系统地解决这些问题的方法。此外:请查看帮助中心以了解您问题中的“缺失部分”。

标签: java recursion data-structures binary-tree


【解决方案1】:

你可以修改 evenBranches() 方法如下:我认为它会覆盖所有边缘情况,如果有任何测试用例,请告诉我,我会修复它。

    public int evenBranches() {
        return evenBranches(overallRoot, 0);
    }

    private int evenBranches(IntTreeNode root, int count) {
        if(root == null || (root.left == null && root.right == null)) {
            return count;
        }
        if(root.data % 2 == 0) {
            count++;
        }
        count += evenBranches(root.left, count);
        count += evenBranches(root.right, count);
        return count;
    }

【讨论】:

    【解决方案2】:

    在检查右分支中的出现时,您可能需要删除 else 条件。否则它只会检查一侧。例如:

    private int evenBranches(IntTreeNode root) {
        if (root == null) {
            return 0;
        } 
        int val = 0;
        if (root.left != null) {
            val += evenBranches(root.left);
        } 
    
        if (root.right != null) {
            val += evenBranches(root.right);
        }
        if (root.data % 2 == 0) {
            return val + 1;
        } else {
            return val;
        } 
    }
    

    【讨论】:

      【解决方案3】:

      您可以通过使用全局变量并在您的树上应用 BFS(广度优先搜索)以这种方式很好地实现所需的结果:

      int evencount = 0; // global-var.
      public int evenBranches() {
          evenBranches(overallRoot);
          return evencount;
      }
      private void evenBranches(IntTreeNode root) {
          if(!root) return;
          if( (root.left || root.right) && (root.data % 2 == 0)){
              evencount++;
          }
          evenBranches(root.left);
          evenBranches(root.right);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-22
        相关资源
        最近更新 更多