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

题目描述

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

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

样例描述

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

思路

二叉树堆式存储遍历
Leetcode--Java--958. 二叉树的完全性检验_第2张图片

  1. 将二叉树按照堆的形式存储,直接遍历求最大结点的编号,如果不是等于结点数n,说明前面还有空的,就不是完全二叉树
  2. 堆的存储性质,当前结点编号k,左孩子编号是2k, 右孩子是2k + 1

代码

/**
 * 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 {
    //记录最大编号和结点个数
    int maxk = 0, n = 0;

    public boolean dfs(TreeNode root, int k) {
        if (root == null) {
            return true;
        }
        //结点编号大于100,无意义直接false(题中说结点数最多100个)
        if (k > 100) {
            return false;
        }
        //结点数加一
        n ++;
        //维护最大编号
        maxk = Math.max(maxk, k);
        return dfs(root.left, 2 * k) && dfs(root.right, 2 * k + 1);
    }

    public boolean isCompleteTree(TreeNode root) {
        if (!dfs(root, 1)) {
            return false;
        }
        //只要不相等,说明前面最大编号结点前面肯定有空的
        return n == maxk;
    }
}

你可能感兴趣的:(Leetcode,完全二叉树,堆式存储)