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

判断是不是完全二叉树

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

/**
该题目的总体思路是:按层排序;

在按层排序的基础上,要对每一层的节点数进行判断以符合完全二叉树的要求;
同时,要处理最后一层的情况

关键点:就是对左右子节点为nullptr时,也需要给出nullptr的数据,
以此作为辅助数据,可以有效的利用完全二叉树的规则,进行逻辑上的正确性判断;
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
    bool isCompleteTree(TreeNode* root) {
        if (root == nullptr)
          return true;

        queue<TreeNode*> s;
        s.push(root);
        auto cur_line_node_count = 1;
        auto cur_line_should_count = 1;
        while (!s.empty()) {
          auto ct = s.size();
          cur_line_node_count = 0;
          for (auto i = 0; i < ct; ++i) {
            auto cur = s.front();
            s.pop();
            if (cur->left != nullptr) {
              ++cur_line_node_count;
              s.push(cur->left);
            }  else {
              s.push(nullptr);
            }
            
            if (cur->right != nullptr) {
              ++cur_line_node_count;
              s.push(cur->right);
            } else {
              s.push(nullptr);
            }
          }
          cur_line_should_count *= 2;
          if (cur_line_node_count != cur_line_should_count)
            break;
        }

        if (!s.empty()) {
          auto ct = s.size();
          for (auto i = 0; i < ct; ++i) {
            auto cur = s.front();
            s.pop();
            if (cur != nullptr && cur->left == nullptr && cur->right == nullptr)
              continue;
            
            if (cur != nullptr)
              return false;
            else
              break;
          }

          for (auto i = 0; i < s.size(); ++i) {
            auto cur = s.front();
            s.pop();
            if (cur != nullptr)
              return false;
          }
          return true;
        }
        return true;
    }
};

全部评论

相关推荐

12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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