Leetcode.958 二叉树的完全性检验

题目链接

Leetcode.958 二叉树的完全性检验 Rating : 1703

题目描述

给定一个二叉树的 root,确定它是否是一个 完全二叉树 。

在一个 完全二叉树 中,除了最后一个关卡外,所有关卡都是完全被填满的,并且最后一个关卡中的所有节点都是尽可能靠左的。它可以包含 12h节点之间的最后一级 h

示例1:

Leetcode.958 二叉树的完全性检验_第1张图片

输入:root = [1,2,3,4,5,6]
输出:true
解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。

示例2:

Leetcode.958 二叉树的完全性检验_第2张图片

输入:root = [1,2,3,4,5,null,7]
输出:false
解释:值为 7 的结点没有尽可能靠向左侧。

提示:
  • 树的结点数在范围 [1, 100]内。
  • 1 < = N o d e . v a l < = 1000 1 <= Node.val <= 1000 1<=Node.val<=1000

分析:

按照 完全二叉树 的性质。使用 层序遍历,在遇到 第一个空结点 之后,后面的应该都是空结点

如果后面还遇到了非空结点,说明该二叉树不是 完全二叉树。

时间复杂度: O ( n ) O(n) O(n)

C++代码:

class Solution {
public:
    bool isCompleteTree(TreeNode* root) {
        queue<TreeNode*> q;
        q.push(root);
       
        //flag 为true 说明已经遇到了空结点
        bool flag = false;

        while(!q.empty()){
            auto t = q.front();
            q.pop();

            if(flag && t != nullptr) return false;

            if(t == nullptr){
                flag = true;
                continue;
            }

            q.push(t->left);
            q.push(t->right);
        }
        return true;
    }
};

Java代码:

class Solution {
    public boolean isCompleteTree(TreeNode root) {
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);

        boolean flag = false;

        while(!q.isEmpty()){
            TreeNode t = q.poll();

            if(flag && t != null) return false;

            if(t == null){
                flag = true;
                continue;
            }

            q.offer(t.left);
            q.offer(t.right);
        }
        return true;
    }
}

你可能感兴趣的:(Leetcode,leetcode,算法,职场和发展)