Check a binary tree is completed or not. A complete binary tree is a binary tree that every level is completed filled except the deepest level. In the deepest level, all nodes must be as left as possible. See more definition
1
/ \
2 3
/
4
is a complete binary.
1
/ \
2 3
\
4
is not a complete binary.
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
class ResultType {
public int depth;
public boolean isFull;
public boolean isComplete;
public ResultType(int depth, boolean isFull, boolean isComplete) {
this.depth = depth;
this.isFull = isFull;
this.isComplete = isComplete;
}
}
public class Solution {
/**
* @param root, the root of binary tree.
* @return true if it is a complete binary tree, or false.
*/
public boolean isComplete(TreeNode root) {
if(root == null) {
return true;
}
return helper(root).isComplete;
}
private ResultType helper(TreeNode root) {
if(root == null) {
return new ResultType(0, true, true);
}
ResultType left = helper(root.left);
ResultType right = helper(root.right);
if(!left.isComplete || !right.isComplete) {
return new ResultType(-1, false, false);
}
if(left.depth == right.depth) {
//left must be full, right at least complete, even be full
if(!left.isFull || !right.isComplete) {
return new ResultType(-1, false, false);
}
return new ResultType(left.depth + 1, right.isFull, true);
}
if(left.depth == right.depth + 1) {
//left is at least complete even to be full
//right must be full
if(!left.isComplete || !right.isFull) {
return new ResultType(-1, false, false);
}
return new ResultType(left.depth + 1, false, true);
}
return new ResultType(-1, false, false);
}
}