我想编写一个方法,如果二叉树是完整和饱和的(每个节点有两个子节点或没有子节点,并且树的所有叶子节点都在相同的深度),则返回true。
我的想法是使用递归。我将检查任何节点,如果它的左儿子具有与其右儿子相等的子节点数,则返回true,否则返回false;
算法如下:
我的想法是使用递归。我将检查任何节点,如果它的左儿子具有与其右儿子相等的子节点数,则返回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;
}
}
我没有放置树的实现,但它非常简单。
算法的思路是检查每个节点中右子孙的数量是否等于左子孙的数量。如果一棵树不完整或不完全,则在某些节点上此规则将不适用。
你认为我的算法正确吗?或者我遗漏了什么?
非常感谢。