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

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

https://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布尔型一维数组
     */
    
    private TreeNode max = null;
    private boolean flag = false;

    public boolean[] judgeIt (TreeNode root) {
        // write code here
        // 判断之后的节点是否有小于已遍历结点的最大值
        // 完全二叉树:出现空的位置之后是否有节点
        // 递归三部曲:返回值boolean,参数:root; 返回值
        // 单层逻辑:存储最大值的max,判断当前是否小于max,false
        // 终结:null,返回true
        boolean[] result = new boolean[2];
        result[0] = binarySearch(root);
        result[1] = binaryPerfect(root);
        System.out.println(result[0]);
        System.out.println(result[1]);
        return result;
    }

    // 判断二叉搜索树 
    private boolean binarySearch(TreeNode root) {

        if (root == null) {
            return true;
        }
        
        boolean left = binarySearch(root.left);
        if (!left) {
            return false;
        }
        if (max != null && max.val > root.val) {
            return false;
        }
        max = root;

        return binarySearch(root.right);
    }

    // 使用广度优先搜索
    // 如果已设置标志位,但仍然出现非空情况,则返回false
    private boolean binaryPerfect(TreeNode root) {

        Queue<TreeNode> queue = new LinkedList<>();
        if (root == null) {
            return true;
        }
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();

            // 处理特殊情况
            if (flag && (node.left != null || node.right != null)) {
                return false;
            }

            if (node.left == null || node.right == null) {
                flag = true;
            }

            if (node.left == null && node.right != null) {
                return false;
            }

            if (node.left != null) {
                queue.offer(node.left);
            }

            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        return true;
    }
}

全部评论

相关推荐

后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
无实习如何秋招上岸
点赞 评论 收藏
分享
迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务