如何判断一棵树是不是完全二叉树

完全二叉树

子节点从左往右生长,一层生长完全才可以生长下一层.

解题思路:

        横向遍历(按层)二叉树的过程中,每个节点的子节点有以下四种情况:

        1-左右都没有 : 该节点为叶子节点

        2-左右都有: 没啥说的,一个没什么幺蛾子的节点.

        3-有右没左 : 出现这种情况直接返回false,这种情况违反完全二叉树的定义

        4-有左没右 : 出现此种情况,证明该节点的左节点应该是最后一层的最后一个节点,其后面遍历到的节点都必须是叶子节点.否则该树不是完全二叉树.

横向遍历二叉树的思路:

        将二叉树的节点放入队列中,弹出一个节将它的子节点先左后右压入队列中.直到队列为空.

扫描二维码关注公众号,回复: 11283293 查看本文章

整体代码如下:

	public static boolean isCBT(Node head){
		if(head == null){
			return true; //空节点是完全二叉树
		}
		Queue<Node> queue = new LinkedList<Node>();
		queue.offer(head);
		Node left = null;
		Node right = null;
		boolean isLeaf = false;
		while(!queue.isEmpty()){
			head = queue.poll();
			left = head.left;
			right = head.right;
                        //判断是否是有右节点没有左节点的情况 : (isLeaf && (left != null || right != null))
			//判断出现第四种情况(有右没左)时,后边的节点是不是都是叶节点 : (isLeaf && (left != null || right != null))
			if((isLeaf && (left != null || right != null)) || (left == null && right != null)){
				return false;
			}
			if(head.left != null){
				queue.offer(left);
			}else if(right != null){
				queue.offer(right);
			}else{
				isLeaf = true;
			}
		}
		return true;
	}

猜你喜欢

转载自blog.csdn.net/weixin_39445556/article/details/104946175