【LeetCode笔记】958. 二叉树的完全性检验(Java、二叉树、BFS)

文章目录

  • 题目描述
  • 思路 && 代码
      • 层级遍历法
      • BFS
      • 二刷

题目描述

  • 考察对完全二叉树性质的理解
    【LeetCode笔记】958. 二叉树的完全性检验(Java、二叉树、BFS)_第1张图片

思路 && 代码

层级遍历法

  • 一开始试了自底向上的DFS,过了90%的用例,还是考虑得不够全 = =
  • 层级遍历:代码比较多,但是总体效率和方法2差不多
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Deque<TreeNode> queue = new ArrayDeque<>();
    public boolean isCompleteTree(TreeNode root) {
        queue.offer(root);
        return bfs(1, 1);
    }
    public boolean bfs(int nodeNums, int except) {
        if(queue.size() == 0) {
            return true;
        }
        int counts = 0;
        boolean flag = false;
        for(int i = 0; i < nodeNums; i++) {
            TreeNode tempNode = queue.pop();
            if(tempNode.left != null) {
                if(flag) {
                    return false;
                }
                queue.offer(tempNode.left);
                counts++;
            }
            else {
                flag = true;
            }
            if(tempNode.right != null) {
                if(flag) {
                    return false;
                }
                queue.offer(tempNode.right);
                counts++;
            }
            else {
                flag = true;
            }
        }
        if(nodeNums != except && !queue.isEmpty()) {
            return false;
        }
        return bfs(counts, 2 * except);
    }
}

BFS

  • 注意:要使用能存储 null 值的集合类(比如 ArrayDeque 就不行)
  • 核心思路:当前节点为空时,如果后面(包括右边、下面)有节点则不是完全二叉树。
class Solution {
    // 完全二叉树判断:当前节点为空时,后面(包括右边、下面)不能有节点
    public boolean isCompleteTree(TreeNode root) {
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        for(TreeNode cur = queue.poll(); cur != null; cur = queue.poll()) {
            queue.offer(cur.left);
            queue.offer(cur.right);
        }
        // 如果之后还有非空元素,说明不是完全二叉树
        while(!queue.isEmpty()) {
            if(queue.poll() != null) {
                return false;
            }
        }
        return true;
    }
}

二刷

class Solution {
    public boolean isCompleteTree(TreeNode root) {
        // jojo的奇妙做法。。不知道怎么想的,反正 A 了,问题不大!
        List<TreeNode> list = new LinkedList<>();
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        list.add(root);
        while(!queue.isEmpty()) {
            TreeNode temp = queue.poll();
            list.add(temp.left);
            list.add(temp.right);
            if(temp.left != null) {
                queue.offer(temp.left);
            }
            if(temp.right != null) {
                queue.offer(temp.right);
            }
        }
        boolean flag = false;
        for(TreeNode temp : list) {
            if(temp == null) {
                flag = true;
            } else if (flag) {
                return false;
            }
        }
        return true;
    }
}
  • 简单写法,八行代码光速解决~
class Solution {
    public boolean isCompleteTree(TreeNode root) {
        LinkedList<TreeNode> queue = new LinkedList<>();
        for(TreeNode cur = root; cur != null; cur = queue.poll()) {
            queue.offer(cur.left);
            queue.offer(cur.right);
        }
        while(!queue.isEmpty()) {
            if(queue.poll() != null) {
                return false;
            }
        }
        return true;
    }
}

你可能感兴趣的:(LeetCode要每天都刷噢,leetcode,java,算法,二叉树,bfs)