我想编写一个方法,如果二叉树已满并且完成(每个节点有2个childern或没有并且树的所有叶都在相同的深度)。算法,检查树是否已满并完成
我的想法是使用递归。我会检查任何节点,如果它的儿子有一定数量的childern,这是它的正确的儿子的数字childern。如果是这样 - 我将返回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;
}
}
我没有把树实现,但它是非常简单的。
该算法的思想是检查是否在每个节点右子的childern的数量是等于左儿子的childern。如果树不完整并且完整 - 那么在某个节点中,这个规则将不适用。
你认为我的alogrithem是相关还是我错过了什么?
非常感谢。
这可以以更简单的方式完成;但我相信这应该在代码审查而不是在这里 – fge
我不问关于代码,因为我正在问关于算法的正确性。怎么样?在复杂性方面?我认为这是非常好的o(n) - 因为n是节点的数量。 – Matoy
你应该更好地发布你的算法的伪代码。恕我直言,它更清晰的阅读。 –