算法-二叉树-判断完全二叉树

2022-4-10 diaba 笔试题

package com.jiucaiyuan.net.algrithm.tree;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * <pre>
 * 【问题】判断一棵树是完全二叉树(Complete Binary Tree)
 * 【概念】完全二叉树:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部(树只有最后一层可能出现不满,只能是右下角缺少子树)
 * 【思路】通过二叉树的宽度优先遍历,判断
 *       > 如果发现某个节点只有右子树,则非完全二叉树
 *       > 如果遇到左右子树不全时,则后面所有节点都无子树
 *</pre>
 * @Author jiucaiyuan  2022/4/10 17:00
 * @mail services@jiucaiyuan.net
 */

public class IsCompleteBinaryTree {
    /**
     * 宽度优先遍历判断是完全二叉树
     *
     * @param root
     */
    public static boolean isCBT(Node root) {
        if (root == null) {
            return true;
        }
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        Node left = null;
        Node right = null;
        boolean leaf = false;
        while (!queue.isEmpty()) {
            Node curr = queue.poll();

            left = curr.left;
            right = curr.right;

            if(
               //如果遇到左右子树不全时,则后面所有节点都要无子树(如果有子树,则非完全二叉树)
                leaf && (left != null || right != null)
                ||
                //如果发现某个节点只有右子树,则非完全二叉树
                (left == null && right != null)
            ){
                return false;
            }

            if (left != null) {
                queue.add(left);
            }
            if (right != null) {
                queue.add(right);
            }
            if(left == null || right==null){
                leaf = true;
            }
        }
        return true;
    }
}

发表评论:

Powered by emlog 京ICP备15045175号-1 Copyright © 2022