leetcode958二叉树的彻底检验-java

最近项目刚刚检查了,又有时间刷leetcode了,一道中等的树1个小时才经过,过久不作了。。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 的结点没有尽量靠向左侧。

 

  public boolean isCompleteTree(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.offer(root);
        int n=1;
        boolean re=true;
        List<Integer>list=new ArrayList<Integer>();
        int tag=0;
        while(!queue.isEmpty()){
            for(int i=0;i<queue.size();i++){
                TreeNode node=queue.poll();
               if(node==null){
                   if(!queue.isEmpty()||queue.poll()!=null){
                    re=false;
                   break;
                   }
               }
               else{
                if(node.left!=null||node.right!=null){
                     if(tag==1){
                    re=false;
                    break;
                    }   
                    queue.offer(node.left);
                    queue.offer(node.right);
                }
                else{
                      
                       tag=1;
                   }
              }
                
            }
            if(re==false)
                break;
            
            
        }
   
        return re;
    }

就是层次遍历,每一个结点若是不是空,而且左右节点都不空就插入队列中,而后这样若是在层次遍历的时候发现有空的节点,而且队列里还有不为空的元素的话,说明不是二叉树。第一次提交的时候忽略了(1,2,3,null,null,7,8)这样的树,(其实想到会有这种状况,可是先试着提交再改代码)。而后我经过tag判断,若是有一个节点的左右子树都是空,后面还有左右子树不都是空,那说明它不是彻底二叉树get

相关文章
相关标签/搜索