关于二叉树的实验 判断一棵树是否为完全二叉树

要求:实现方法:*boolean isCompleteBinaryTree(),*判断二叉树是不是一棵完全二叉树,如果是,返回true,否则返回false。

先说一下,这个代码的思路不是我想出来的,是参考的一位大佬的(就是下面图片里的),我只是把代码改了改,加了些注释,然后写了写我自己关于这个代码的理解嘿嘿嘿 再次感谢大佬~

不会@ 只能截图了哈哈

首先写这个代码的大体思路是这样的:

1、先写一个public函数用于在主函数中进行调用,而该函数中调用private boolean isCompleteBinaryTree()函数;

2、再写private boolean isCompleteBinaryTree(BiTreeNode t)函数,该函数有一个传入参数BiTreeNode t,在该函数中实现具体的功能;

具体代码如下:

public boolean isCompleteBinaryTree(){
		return isCompleteBinaryTree(root);
	}
	
	private boolean isCompleteBinaryTree(BiTreeNode<T> t) {
		  if (t == null) {
	            return true;//如果为空,则为完全二叉树
	        }
	        Queue<BiTreeNode> queue = new LinkedList<BiTreeNode>();
	        boolean state = false; //该变量用来标记一个状态是否开启,如果开启(开启条件是当前节点的左右孩子都为空,或者左不为空,右为空),那么之后的节点必须都是叶子节点
	        queue.offer(t);//通过队列实现层次遍历,把第一个根节点先加进队列里
	        while (!queue.isEmpty()) {//判断队列是否为空
	            t = queue.poll();//删除队首元素并返回其值
	            if ((state && (t.lchild != null || t.rchild != null))){//标志的状态已经发生,但是后面的节点不是叶子节点
	                return false;
	            } 
	            if(t.lchild == null && t.rchild != null) {//2、当前节点有右孩子,但是没有左孩子
	            	return false;
	            }
	             if (t.lchild != null) {//左不为空,加入队列
	                queue.offer(t.lchild);
	            }
	             if (t.rchild != null) {//右不为空,加入队列
	                queue.offer(t.rchild);
	            }
	             if ((t.lchild!= null && t.rchild == null)||(t.lchild==null && t.rchild == null)) {//这种条件下状态开启
	                state = true;
	            }
	        }
	        return true;
}

下面是我自己的一些理解:
1、判断是否为完全二叉树关键是对所遍历的当前节点的情况进行分类,本实验代码中有五个if语句,其中前四个是对当前节点的情况进行分类的,当前节点的四种情况如下:
在这里插入图片描述

如果当前节点是第一种情况,就把该节点放入队列,继续访问下一个节点;
如果是第二种情况,那么可以把该节点放入队列,但是要保证这个节点之后的每一个节点都是叶子节点;
如果是第三种情况,则一定不会是完全二叉树,不用放入队列,直接返回false即可;
如果是第四种情况,和第二种情况类似,可以放入队列,但是要保证之后的每一个节点都是叶子节点;

分析完以上四种情况之后,就会发现需要一个变量来记录开始是否从当前节点开始之后的每一个节点都必须是叶子节点的这种模式,所以代码中用变量state进行标志,这个变量是一个布尔型变量,初值是false,一旦需要开启上述的那种模式,就立刻把这个变量的值设置为true,表示上述模式开始,之后的每一个节点都必须是叶子节点。

所以还要设置一个if语句来判断什么时候要开启上述那种模式,而开启的条件就是以上四种情况中的第二种和第四种情况。

2.这个代码总体思路就是,把要判断的树进行层次遍历,对每一个节点逐一判断,如果符合条件,就放进队列里面,然后每次判断下一个节点之前都会把上一个节点从队列里面去掉,直至队列为空,即所有的节点都遍历完成。

3.判断是否是完全二叉树这个操作是在整个遍历过程中完成的,如果所有节点都遍历完成了,但还没有出现返回值是false的情况,说明这个树就是完全二叉树,整个函数的返回值就是true。

4.这个代码是通过利用队列来实现的

5.对了,要注意区别完全二叉树和满二叉树的区别,完全二叉树是停在了奔向满二叉树的某一步,如下图:

这里是我拍的课本上的图

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值