A complete binary tree is defined as a binary tree in which every level, except possibly the deepest, is completely filled. At deepest level, all nodes must be as far left a
The following code simply treats every possible cases. Tree height is obtained along the way to avoid another recursion.
enum CompleteType
{
kNotComplete = 0,
kComplete = 1, // Complete but not full
kFull = 2,
kEmpty = 3
};
CompleteType isTreeComplete(Node* node, int* height)
{
if (node == NULL)
{
*height = 0;
return kEmpty;
}
int leftHeight, rightHeight;
CompleteType leftCompleteType = isTreeComplete(node->left, &leftHeight);
CompleteType rightCompleteType = isTreeComplete(node->right, &rightHeight);
*height = max(leftHeight, rightHeight) + 1;
// Straight forwardly treat all possible cases
if (leftCompleteType == kComplete &&
rightCompleteType == kEmpty &&
leftHeight == rightHeight + 1)
return kComplete;
if (leftCompleteType == Full)
{
if (rightCompleteType == kEmpty && leftHeight == rightHeight + 1)
return kComplete;
if (leftHeight == rightHeight)
{
if (rightCompleteType == kComplete)
return kComplete;
if (rightCompleteType == kFull)
return kFull;
}
}
if (leftCompleteType == kEmpty && rightCompleteType == kEmpty)
return kFull;
return kNotComplete;
}
bool isTreeComplete(Node* node)
{
int height;
return (isTreeComplete(node, &height) != kNotComplete);
}