【发布时间】:2015-04-30 04:07:13
【问题描述】:
我正在尝试编写一个方法,如果二叉树完整且完整(每个节点有 2 个子节点或没有子节点,并且树的所有叶子都处于相同深度),该方法将返回 true。
我的想法是使用递归。我将检查任何节点,如果它的左儿子的孩子数量等于它的右儿子的孩子数量。如果是 - 我将返回 true,否则返回 false;
算法将如下所示:
public class Utils {
public boolean isFullCompleteTree(Tree<Integer> t) {
TreeInfo rootInfo = isFullCompleteTree(t.getRoot());
return rootInfo.valid;
}
public TreeInfo isFullCompleteTree(Node<Integer> node) {
boolean valid = true;
if (node == null) {
return new TreeInfo(true, 0);
}
TreeInfo rightInfo = isFullCompleteTree(node.goRight());
TreeInfo leftInfo = isFullCompleteTree(node.goLeft());
if ((!rightInfo.valid) || (!leftInfo.valid)) {
valid = false;
}
if (rightInfo.numChildern != leftInfo.numChildern) {
valid = false;
}
return new TreeInfo(valid, rightInfo.numChildern + leftInfo.numChildern
+ 1);
}
}
class TreeInfo {
public boolean valid;
public int numChildern;
public TreeInfo(boolean valid, int numChildern) {
this.valid = valid;
this.numChildern = numChildern;
}
}
我没有放树实现,但它非常简单。
该算法的思想是检查每个节点中右儿子的孩子的数量是否等于左儿子的孩子。如果树不完整且不完整 - 那么在某些节点中,此规则将不适用。
你认为我的算法是正确的还是我遗漏了什么?
非常感谢。
【问题讨论】:
-
这可以通过更简单的方式完成;但我认为这应该进行代码审查而不是在这里
-
我不是在询问代码,而是在询问算法的正确性。简单如何?在复杂性方面?我认为它非常好 o(n) - 因为 n 是节点数。
-
你最好把算法的伪代码贴出来。恕我直言,阅读起来更加清晰。
-
如果代码按预期工作并且您正在寻求改进,您可以在Code Review 站点上发布,然后将其从 Stack Overflow 中删除。如果你这样做,最好也包含你的树实现。
-
算法的伪代码:如果对于每个节点 - 右孩子的数量等于左孩子的数量,则返回 true。否则为假。
标签: java algorithm recursion tree