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

/*
 * 判断是否为完全二叉树:
 * 完全二叉树:除叶子节点外的节点都包含左右节点,此为满二叉树;不为满二叉树,但是叶子节点都集中在左边,没有节点存在有右子树但是没有左子树的情况,也为完全二叉树
 * 所以要判断的情况:
 * 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);
    }
}

猜你喜欢

转载自blog.csdn.net/cyanchen666/article/details/81980813
今日推荐