判断完全二叉树

2022-09-14 10:04:51 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

完全二叉树的定义: 一棵二叉树,除了最后一层之外都是完全填充的,并且最后一层的叶子结点都在左边。

https://baike.baidu.com/item/完全二叉树/7773232?fr=aladdin

百度定义

思路:层序遍历二叉树

如果一个结点,左右孩子都不为空,则pop该节点,将其左右孩子入队列

如果一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树

如果一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空:::::则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则返回false。

非完全二叉树的例子(对应方法的正确性和必要性):

下面写代码:

定义结点:

代码语言:javascript复制
    public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int data) {
			this.value = data;
		}
	}

方法:

代码语言:javascript复制
	public static boolean isCBT(Node head) {
		if (head == null) {
			return true;
		}
		Queue<Node> queue = new LinkedList<Node>();
		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;
	}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158639.html原文链接:https://javaforall.cn

0 人点赞