Weekly Contest 115的 二叉树的彻底性检验:node
给定一个二叉树,肯定它是不是一个彻底二叉树。spa
百度百科中对彻底二叉树的定义以下:code
若设二叉树的深度为
h
,除第h
层外,其它各层 (1~h-1
) 的结点数都达到最大个数,第 h 层全部的结点都连续集中在最左边,这就是彻底二叉树。(注:第h
层可能包含1~ 2h
个节点。)blog示例1:
队列
输入:[1,2,3,4,5,6] 输出:true 解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的全部结点({4,5,6})都尽量地向左。示例2:
leetcode
输入:[1,2,3,4,5,null,7] 输出:false 解释:值为 7 的结点没有尽量靠向左侧。提示:get
- 树中将会有
1
到100
个结点。
本题基本没有难度,且在彻底二叉树的百度百科中已经给出了思路:it
判断一棵树是不是彻底二叉树的思路io
- 若是树为空,则直接返回
false
若是树不为空:层序遍历二叉树class
- 若是一个结点左右孩子都不为空,则
pop
该节点,将其左右孩子入队列;- 若是遇到一个结点,左孩子为空,右孩子不为空,则该树必定不是彻底二叉树;
- 若是遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点以后的队列中的结点都为叶子节点;该树才是彻底二叉树,不然就不是彻底二叉树;
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } * 958. 二叉树的彻底性检验 * @param root * @return */ public boolean isCompleteTree(TreeNode root) { boolean flag=true; //左子树的标志位 boolean isLeft=false; if(root!=null){ Queue<TreeNode> queue=new LinkedList<>(); queue.add(root); while (queue.size()!=0){ TreeNode node=queue.poll(); TreeNode left=node.left; TreeNode right=node.right; if((left==null && right!=null)//左节点为null,且右节点不为null(是否为叶子节点) || (isLeft && (left!=null || right!=null))){//若是为左子树,则左右节点都不能为null flag=false; break; } if(left!=null){ queue.offer(left); } if(right!=null){ queue.offer(right); }else{ isLeft=true; } } }else{ flag=false; } return flag; }