题解 | #判断是不是完全二叉树#

判断是不是完全二叉树

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

/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <list>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return bool布尔型
     */
    bool isBranchEmpty(TreeNode*
                       root) {  //判断根节点左右指针是否为空。都为空,返回true;否则返回false.
        if (root->left == nullptr && root->right == nullptr) {
            return true;
        }
        return false;
    }
  	//使用广度优先搜索算法,用一个队列list记录首次出现空节点的那一层所有节点。只有list中节点满足#1.“非空,非空,...,非空,空,空,空”;2.list前面所有非空节点都没有下一层节点。#这两个条件,树才是完全二叉树
    bool isCompleteTree(TreeNode* root) {
        // write code here
        if (root == nullptr) {
            return true;
        }
        list<TreeNode*> li; //记录每一层的节点
        li.push_back(root);
        bool tag = true;    //如果list中任意节点的下一层节点为空则置为false
        while (tag) {   //循环结束后,list记录第一次出现空节点的那一层节点
            int size = li.size();
            while (size--) {
                if (li.front()->left == nullptr || li.front()->right == nullptr) {
                    tag = false;
                }
                li.push_back(li.front()->left);
                li.push_back(li.front()->right);
                li.pop_front();
            }
        }
        TreeNode* p = li.front();   //循环结束后,list记录第一次出现空节点的那一层节点
        li.pop_front();
        while (!li.empty()) {
            if (p != nullptr && isBranchEmpty(p) == false) {    //如果一个节点不为空,节点下一层存在节点,证明不是完全树
                return false;
            }
            if (p == nullptr && li.front() != nullptr) {    //如果上一个节点为空,下一个节点不为空,证明不是完全树
                return false;
            }
            p = li.front();
            li.pop_front();
        }
        return true;
    }
};

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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