判断一棵树是否为完全二叉树的算法c语言_算法题—完全二叉树

题目描述

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

完全二叉树

完全二叉树,即每一层都是要按从左往右,依此填满,最后一层可以不满,但是所有节点都集中在最左边,如图,图中1,2,3,4层节点的方向都是从左往右依此填充,每一层填充满了才进入下一层,最后不满,但是它也是从左往右依此填充的,节点都堆在最左边。

65c44a271b349d4e57fb2a4075f89da4.png

如下图,最后一层不是从左往右依此填充的,因此不为完全二叉树。

17e1ae1a58562befa65b5f60720d3a59.png

节点8和节点9中间隔离一个节点的空位,9应该在8的右边,整棵树才是完全二叉树。把黑色的节点9放到红色的节点9处,整棵树才是完全二叉树。

ba63ac05a3dec2f7d9233f64a7a77c7b.png

树的层次遍历

一棵树要从顶到底按层遍历,要完成先进先出的操作,因此,可以使用一个队列来完成,例如,按层遍历如下的树。

65c44a271b349d4e57fb2a4075f89da4.png

先把1进队列,然后出队,把1的左右节点2、3依此进队,2出队,把2的左右节点5、6依此进队,3出队,把3的左右节点7、8进队......依此类推,直到队列为空,整棵树按层遍历也就结束了。

a242f5d4d1f33ca8154964dc5fe53f78.png
ae67d613a805be73e54a3101ad2618e0.png
752806e4b121775e428987250f950bb7.png
f18cdda352e4c8d92f79810e80a6e12e.png
783fb42038edb458c61b8b8d0482f03e.png

判断是否为完全二叉树

一棵完全二叉树有以下两种情况。

1)节点有右孩子没有左孩子的情况下,返回false

2)不违反1的条件下,左右不全的节点,则按层次遍历的往后的节点都为叶子节点。

因此思路就是按层遍历,然后判断以上的两种情况,最后返回结果。

代码

public static boolean isCBT(Node head) { if (head == null) { return true; } Queue queue = new LinkedList(); boolean leaf = false; Node l = null; Node r = null; queue.offer(head); while (!queue.isEmpty()) { head = queue.poll(); l = head.left; r = head.right; if ((leaf && (l != null || r != null))  || (l == null && r != null)) { return false; } if (l != null) { queue.offer(l); } if (r != null) { queue.offer(r); } else { leaf = true; } } return true; }
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值