题解 | #判断一棵二叉树是否为搜索二叉树和完全二叉树#

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

http://www.nowcoder.com/practice/f31fc6d3caf24e7f8b4deb5cd9b5fa97

import java.util.*;

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

public class Solution {
    /**
     * 
     * @param root TreeNode类 the root
     * @return bool布尔型一维数组
     */
    public boolean[] judgeIt (TreeNode root) {
        if(root == null || (root.left == null && root.right == null)) return new boolean[]{true , true} ;
        boolean[] res = new boolean[2] ;
        res[0] = isSearchTree(root) ;
        res[1] = isCompleteTree(root) ;
        return res ;
    }
    public boolean isSearchTree(TreeNode root) {
        if(root == null || ((root.left == null && root.right == null))) return true ;
        //寻找左子树的最大值
        int lMax = -1 ;
        if(root.left != null) {
            TreeNode t = root.left ;
            while(t.right != null) {
                t = t.right ;
            }
            lMax = t.val ;
        }
        //寻找右子树的最小值
        int rMin = 500001 ;
        if(root.right != null) {
            TreeNode t = root.right ;
            while(t.left != null) {
                t = t.left ;
            }
            rMin = t.val ;
        }
        if(root.val > lMax && root.val < rMin) {
            return isSearchTree(root.left) && isSearchTree(root.right) ;
        } else {
            return false ;
        }
    }
    
    public boolean isCompleteTree(TreeNode root) {
        if(root == null) return true ;
        Queue<TreeNode> que = new LinkedList<>() ;
        que.offer(root) ;
        TreeNode t = null ;
        boolean firstLeave = false ;//是否出现 缺右
        while(!que.isEmpty()) {
            t = que.poll() ;
            if(t.left == null && t.right != null) return false ;
            if(firstLeave && !(t.left == null && t.right == null)) {
                return false ;
            }
            //只要第一次出现 缺右现象,后面的节点都必须是 叶子结点
            if(firstLeave == false && t.right == null) {
                firstLeave = true ;
            } 
            if(t.left != null) que.offer(t.left) ;
            if(t.right != null) que.offer(t.right) ;
        }
        return true ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务