判断一棵二叉树是否为完全二叉树

本文介绍了一种判断一棵树是否为完全二叉树的算法。完全二叉树的定义为除叶子节点外的节点都包含左右节点,或叶子节点集中于左部,无右子树而无左子树的情况。通过队列实现层次遍历,设置标记判断子树状态,确保一旦发现非满节点,后续节点均为叶子节点。
/*
 * 判断是否为完全二叉树:
 * 完全二叉树:除叶子节点外的节点都包含左右节点,此为满二叉树;不为满二叉树,但是叶子节点都集中在左边,没有节点存在有右子树但是没有左子树的情况,也为完全二叉树
 * 所以要判断的情况:
 * 1、一个节点有右子树但是没有左子树,返回false
 * 2、一个节点有左子树没有右子树,此时要求此节点之后的所有节点都为叶子节点,否则返回false
 * 
 * 下面代码的实现思路:利用LinkedList模拟队列,利用其先进先出的特点来便于依次处理节点;
 * 设置一个标记判断是否有子树的存在,这个标记会变成true当且仅当左子树为空或右子树为空的时候;
 * 一旦该标记为true,后续出现节点存在子树直接返回false即可。
 * */

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;


class TreeNode {//接口实现要放在类定义外面
		    int val = 0;
		    TreeNode left = null;
		    TreeNode right = null;
		    public TreeNode(int val) {
		        this.val = val;
		    }
		}
public class findKelem {
	
	public boolean idBinaryTree(TreeNode root){
		if(root == null){
			return false;
		}
		Queue<TreeNode> queue=new LinkedList<TreeNode>();//利用队列先进先出的特性来层次遍历地处理各个节点
		queue.offer(root);
		
		//为true的情况只有当左子树或右子树为空的情况,一旦标记为true后,该节点之后的所有节点只能为叶子节点;若是左子树为空使得noChild为true的情况,当前节点有右节点也要返回false
		boolean noChild=false;
		while(!queue.isEmpty()){
			TreeNode cur=queue.poll();
			if(cur.left != null){
				if(noChild){
					return false;
				}
				queue.offer(cur.left);
			}
			else{
				noChild=true;
			}

			if(cur.right != null){
				if(noChild){
					return false;
				}
				queue.offer(cur.right);
			}
			else{
				noChild=true;
			}
		}
		return true;
	}
	
    public static void main(String[] args) {
        TreeNode root = new TreeNode(0);
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(3);
 
        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node1.right = node4;//node2时为false,node1时未true
 
        findKelem test = new findKelem();
        boolean result = test.idBinaryTree(root);
        System.out.println(result);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值