数据结构—判断一棵二叉树是否是完全二叉树(java)

判断一棵二叉树是否是完全二叉树
一,完全二叉树的三种节点
完全二叉树有右树必有左树,,节点编号和满二叉树一一对应
1,度为2的节点有n个
2,度为1的节点只能有1个
3,度为0的节点有n个
二,具体思路
1,分两个阶段,第一阶段所有节点都有左树右树,当遇到节点只有左树,或是没有子树切换第二阶段
2,该阶段所有节点权全为叶子节点,遇到一个节点有子树就不是完全二叉树
3,使用层序遍历,借用队列求解
三,代码实现

public class IsCompleteTree {
    public boolean isCompleteTree(TreeNode root) {
        if (root == null) {
            return true;
        }
        //层序
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        //引入标志位
        boolean flag = false;
        while (!queue.isEmpty()) {
            //cur表示当前访问节点
            TreeNode cur = queue.poll();
            if (!flag) {
                if (cur.left != null && cur.right != null) {
                    //当前在第一阶段
                    queue.offer(cur.left);
                    queue.offer(cur.right);
                } else if (cur.right != null && cur.left == null) {
                    // 此时只有右树没有左树,反例
                    return false;
                } else if (cur.left != null && cur.right == null) {
                    //切换状态
                    // 只有左树没有右树,此时cur是碰到的第一个只有左树的节点
                    flag = true;
                    queue.offer(cur.left);
                } else {
                    // 此时左树和右树全部为空,cur第一个碰到的叶子节
                    flag = true;
                }
            }else{
                // 此时处在第二阶段,第二阶段中的所有节点不可能有子树
                // 有一个反例就false
                if (cur.left != null || cur.right != null) {
                    return false;
                }
            }
        }
        return true;
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜羊羊zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值