辛星Java树算法第十三篇:判断二叉树是否为完全二叉树

对于完全二叉树,这里给一个来自百度百科的描述: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

我们可以根据题意做题即可,我们可以采用分层遍历的方式,在判断一个具体的节点的时候,我们可以有如下的判断依据:
(1).如果这个节点的左子树为null,右子树不为null,则一定不是完全二叉树。
(2).如果这个节点的左右子树均为null,或者这个节点的左子树不为null但是右子树为null,则当前层或者下一层不能再出现含有左右子树的节点。
(3).如果当前节点的左右子树均不为null,则观察下一个节点。

只要确认这个思路没问题,接下来就是把代码写出来了。代码实现也比较简单,我们这里给出代码实现:

package com.mengzhidu.teach.algorithm.tree.demo.basic;

import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;

import java.util.ArrayDeque;
import java.util.Queue;

/**
 * 判断一棵树是否为完全二叉树
 * 所谓完全二叉树,就是只有最后两层可以是叶子节点
 */
public class CompleteTreeDemo {

    public static void main(String[] args) {
        TreeNode node = TreeNodeHelper.getTreeNode();
        boolean result = isCompleteTree(node);
        System.out.println("结果是:" + result);
    }


    private static boolean isCompleteTree(TreeNode node) {
        if (node == null) {
            return false;
        }

        boolean hasLeaf = false;
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(node);
        while (!queue.isEmpty()) {
            TreeNode tmp = queue.poll();
            if (tmp.getLeft() == null) {
                if (tmp.getRight() != null) {
                    return false;
                }
                if (tmp.getRight() == null) {
                    hasLeaf = true;
                }
            } else {
                if (hasLeaf) {
                    return false;
                }
                if (tmp.getRight() == null) {
                    hasLeaf = true;
                    queue.add(tmp.getLeft());
                }
                if (tmp.getRight() != null) {
                    queue.add(tmp.getLeft());
                    queue.add(tmp.getRight());
                }
            }
        }
        return true;
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值