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

判断是不是完全二叉树

https://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布尔型
    */
    public boolean isCompleteTree(TreeNode root) {
        // 空树属于完全二叉树
        if (root == null) {
            return true;
        }
        return judgment(root);
    }

    /**
     * 传入二叉树。判断该树是否为完全二叉树
     *
     * @param root 根节点
     * @return boolean 判断结果
     * @apiNote
     * @since 2023/1/3 13:52
     */
    public boolean judgment(TreeNode root) {
        // 对根节点进行判断
        // 如果该节点不存在左子节点,但存在右子节点,说明不是完全二叉树
        if (root.right != null && root.left == null) {
            return false;
        }
        // 如果该节点存在左子节点,但不存在右子节点,我们需要判断该左子节点是否为叶子节点
        else if (root.left != null && root.right == null) {
            if (root.left.left != null || root.left.right != null) {
                return false;
            }
        }
        // 如果该节点左右子树均存在,需要判断左子树是否为叶子节点,如果是需要判断右子树是否为叶子节点
        else if (root.left != null) {
            if (root.left.left == null || root.left.right == null) {
                if (root.right.left != null || root.right.right != null) {
                    return false;
                }
            }
        }
        // 递归的调用方法,判断左右子树是否满足条件
        if (root.left != null) {
            if (!judgment(root.left)) {
                return false;
            }
        }
        if (root.right != null) {
            return judgment(root.right);
        }
        return true;
    }
}
全部评论

相关推荐

字节一直是我的白月光,考虑到转正还是拒了日常实习。
从今天开始狠狠卷JV...:为什么你释放的offer没流到我头上
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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