题解 | NO.35#判断是不是完全二叉树#3.12

判断是不是完全二叉树

https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return bool布尔型
 */
//基本思想:使用循环队列对二叉树进行层次遍历,空结点也入队,当遇到第一个空结点时,判断后续队列中结点是否有
//非空结点,如果有则说明不是完全二叉树;反之则是。
#define SizeMax 100
bool isCompleteTree(struct TreeNode* root ) {
    //空树,直接返回true
    if(root == NULL)
        return true;
    //用队列进行层次遍历,空结点也入队
    struct TreeNode* Queue[SizeMax];
    int head = 0;
    int tail = 0;
    struct TreeNode* temp = NULL;
    //头结点入队
    Queue[tail] = root;
    tail = (tail + 1) % SizeMax;
    //队不空则循环继续
    while(tail > head){
        //对头结点出队
        temp = Queue[head];
        head = (head + 1) % SizeMax;
        //队头结点不为空,则将其孩子结点先左后右依次入队
        if(temp != NULL){
            Queue[tail] = temp->left;
            tail = (tail + 1) % SizeMax;
            Queue[tail] = temp->right;
            tail = (tail + 1) % SizeMax;
        }
        //队头结点为空,跳出循环
        else
            break;
    }
    //遍历队列中剩余结点
    while(tail > head){
        temp = Queue[head];
        head = (head + 1) % SizeMax;
        //若存在非空结点,说明不是完全二叉树
        if(temp != NULL)
            return false;
    }
    //第一个空结点后不存在非空结点,说明是完全二叉树
    return true;
}

//用循环队列就不用担心结点数超过数组了

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-25 17:51
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务