2017-02-03 152 views
1

以下是Java拼图(http://code-exercises.com/programming/medium/28/strict-binary-tree-check)中的一个小问题。其任务是编写一种方法来检查在给定的二叉树中是否所有节点都有0或2个子节点。Java中二叉树的递归检查

他们的解决方案是以下

public Boolean isStrictTree(TreeNode node) { 
    if (node == null) {return true;} 
    if ((node.left() == null && node.right() != null) || (node.left() != null && node.right() == null)) {return false;} 

    return isStrictTree(node.left()) && isStrictTree(node.right()); 
} 

我想出了类似的东西,但它不工作。所不同的是

一)1号线 - 处理无效的情况下(返回“零”,而不是“真”)

B)递归结构 - 矿以某种方式混在一起(在某种程度上即应如果我追踪它会发生什么事情),而不是将解决方案分散在两行 - 条件语句和返回语句。

public Boolean isStrictTree(TreeNode node) { 
    if (node == null) {return null;} 

    else if ((isStrictTree(node.left()) == true) && (isStrictTree(node.right())==null)) {return false;} 

    return true; 
} 

该脚本运行但不返回任何内容。我真的有兴趣了解为什么它不起作用,似乎是我可以在这里学到的东西,所以任何见解都是值得赞赏的。

+0

请提供整个MCVE。添加驱动问题结果的主程序。我很好奇如何定义一个返回类型和值的例程“不返回任何东西”。在语义上,这应该是不可能的。 – Prune

回答

2

有两种选择:节点有效/平衡,然后返回true或节点无效/不平衡,返回false。为什么你想引入第三种状态 - null?这件事没有必要。

为什么它不工作:在(isStrictTree(node.left()) == true您的来电isStrictTree(...)将在某个时间点返回null,所以你比较它与true时得到一个NullPointerException异常。