Java验证一棵树是否是完全二叉树

完全二叉树

  若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。

 

判断二叉树是否为完全二叉树。完全二叉树的定义是,前n-1层都是满的,第n层如有空缺,则是缺在右边,即第n层的最右边的节点,它的左边是满的,右边是空的。

以3层二叉树为例,以下情况为完全二叉树:

我们可以根据题意做题即可,我们可以采用分层遍历的方式,在判断一个具体的节点的时候,我们可以有如下的判断依据:
(1).如果这个节点的左子树为null,右子树不为null,则一定不是完全二叉树。
(2).如果这个节点的左右子树均为null(这个不用判断当前层或者下一层不能再出现含有左右子树的节点),或者这个节点的左子树不为null但是右子树为null,则当前层或者下一层不能再出现含有左右子树的节点。
(3).如果当前节点的左右子树均不为null,则观察下一个节点。

public boolean isCompleteTree(TreeNode root){
        
        if(root == null){
            return false;
        }
        
        // 1. 先对树进行层序遍历
        // 如果这个标记为 false, 说明还是处在第一阶段
        // 如果这个标记为 true , 接下来的节点就不能有子树
        // 也就是第二阶段开始了
        int flg = 1;//第一阶段:1 第二阶段:2
        
        LinkedList<TreeNode> queue = new LinkedList();
        
        queue.add(root);
        
        while(!queue.isEmpty()){
            TreeNode temp = queue.poll();
            
            if(flg == 1){
                
                // 合格的状态, 继续往下遍历.
                // 就把左右子树加入队列就行了
                if(temp.left != null && temp.right != null){
                    queue.offer(temp.left);
                    queue.offer(temp.right);
                }else if(temp.left == null && temp.right != null){
                    // 这种情况铁定不是完全二叉树
                    return false;
                }else if(temp.left != null && temp.right == null){
                    // 这是临界状态, 开启第二阶段
                    queue.offer(temp.left);
                    //开启第二阶段
                    flg = 2;
                }else{
                    // 左右子树都为空, 开启第二阶段
                    flg = 2;
                }
            }else{
                //开启第二阶段
                // 第二阶段要求节点必须没有子树. 只要子树存在, 就不是完全二叉树
                if(temp.left != null || temp.right != null){
                    return false;
                }
            }
        }
        
        return true;
    }

.如果这个节点的左右子树均为null(这个不用判断当前层或者下一层不能再出现含有左右子树的节点)的写法:

这样更易于理解: 

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    
    //是否是儿茶搜索树
    boolean isTwoSearchFlg = true;
    
    /**
     * 
     * @param root TreeNode类 the root
     * @return bool布尔型一维数组
     */
    public boolean[] judgeIt (TreeNode root) {
        boolean[] result = new boolean[2];
        istwoSearchTree(root);
        result[0] = isTwoSearchFlg;
        
        result[1] = isFullTree(root);
        
        return result;
    }
    
    int preTreeNodeVal = Integer.MIN_VALUE;
    public void istwoSearchTree(TreeNode root){
       
        if(root == null || !isTwoSearchFlg){
            return;
        }
        
        istwoSearchTree(root.left);
        if(root.val > preTreeNodeVal){
            preTreeNodeVal = root.val;
        }else{
            isTwoSearchFlg = false;
            return;
        }
        istwoSearchTree(root.right);
    }
    
    
    
    public boolean isFullTree(TreeNode root){
        
        if(root == null){
            return false;
        }
        
        int condition = 1;
        
        LinkedList<TreeNode> queue = new LinkedList();
        queue.offer(root);
            
        while(!queue.isEmpty()){
            TreeNode temp = queue.poll();
            
            if(1 == condition){
                if(temp.left!=null && temp.right!=null){
                    queue.offer(temp.left);
                    queue.offer(temp.right);
                }else if(temp.left == null && temp.right != null){
                    return false;
                }else if(temp.left!=null && temp.right == null){
                    condition = 2;
                    queue.offer(temp.left);
                }
            }else{
                if(temp.left!=null || temp.right != null){
                    return false;
                }
            }
        }
        
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/luzhensmart/article/details/112639981
今日推荐