How to determine whether a binary tree is complete?

前端 未结 16 1601
渐次进展
渐次进展 2021-01-02 19:15

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

16条回答
  •  轮回少年
    2021-01-02 19:40

    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);
    }
    

提交回复
热议问题