随笔记录
算法-二叉树-判断完全二叉树
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;
}
}
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容