题解 | JAVA #判断是不是完全二叉树# 贴一个递归解决的
判断是不是完全二叉树
http://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae
思路简单,全在注释中
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
int deep = 0, maxNum = 0;
boolean flag = true;
public int dfs(TreeNode node, int level, int num) {
if (!flag || node == null) return 0;
if (level > deep) {
if (num != 1 << level) {flag = false; return 0;} // 更深层的第一个编号不是2的次幂
maxNum = num; deep = level; // 记录最大值
}
else if (num > maxNum + 1) {flag = false; return 0;} // 最大编号出现跳跃,意味着最底层不是连续的
else maxNum = Math.max(maxNum, num); // 记录最大编号
if (node.left == null && node.right != null) {flag = false; return 0;} // 有右孩子无左孩子
return dfs(node.left, level + 1, num << 1) + dfs(node.right, level + 1, (num << 1) + 1) + 1;
}
public boolean isCompleteTree (TreeNode root) {
// write code here
int sum = dfs(root, 0, 1);
// 检测数节点总值是否是 大于 满节点的倒数第二层 且 小于等于 满节点的当前层
return flag && sum <= ((int)Math.pow(2, deep + 1) - 1) && sum >= ((int)Math.pow(2, deep));
}
}