判定满二叉树是否为二叉搜索树(Case通过率只有80%)

import java.util.*;
public class Main{
    static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val){
            this.val =val;
            this.left = left;
            this.right = right;
        }
    }
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String numStr = scanner.nextLine();
        String[] strArr = numStr.split(",");
        int len = strArr.length;
        if(strArr[0].equals("None")){
            System.out.println("True");
            return;
        }
        int[] numArr = new int[len];
        for(int i=0; i<len; i++){
            numArr[i] = Integer.parseInt(strArr[i]);
        }
        TreeNode tree = construct(numArr, 0);
        boolean result = isSearch(tree);
        if(result==true){
            System.out.println("True");
        }
        else{
            System.out.println("False");
        }
    }
    public static TreeNode construct(int[] numArr, int index){
        if(numArr==null)
            return null;
        if(numArr.length==1){
            TreeNode root = new TreeNode(numArr[0]);
            return root;
        }
        TreeNode root = null;
        if(index<numArr.length){
            int value = numArr[index];
            root = new TreeNode(value);
            root.left = construct(numArr, 2*index+1);
            root.right = construct(numArr, 2*index+2);
            return root;
        }
        return root;
    }
    // 下面的做法错在没有管节点和祖先节点之间的关系,
    // 只考虑了当前节点和其左右子节点之间的关系
    /*
    public static boolean isSearch(TreeNode root){
        if(root==null)
            return true;
        if(root.left==null&&root.right==null)
            return true;
        if(root.left==null&&root.right!=null){
            if(root.right.val<=root.val)
                return false;
        }
        if(root.left!=null&&root.right==null){
            if(root.left.val>=root.val)
                return false;
        }
        if(root.left!=null&&root.right!=null){
            if(root.left.val>=root.val||root.right.val<=root.val)
                return false;
        }
        return isSearch(root.left)&&isSearch(root.right);
    }
    */
  //正确的做法
    public static boolean isSearch(TreeNode root){
        LinkedList<Integer> list = new LinkedList<>();
        midOrder(root, list);
        for(int i=1; i<list.size(); i++){
            if(list.get(i-1)>=list.get(i)){
                return false;
            }
        }
        return true;
    }
    public static void midOrder(TreeNode root, LinkedList list){
        if(root==null)
            return;
        midOrder(root.left, list);
        list.add(root.val);
        midOrder(root.right, list);
    }
}
感谢楼下大佬的讲解(手动点赞)
#Java#
全部评论
你这个思路感觉不对,你是判断左右节点是否小于/大于当前节点就递归判断了,这种方法没有管节点和祖先节点的关系啊。第一层4  第二层2 6 第三层1 10 5 7。10大于2,符合递归判断的情况,但同时也大于了根节点4。你的算法似乎处理不了这种情况。 应该用中序遍历的思路,左根右。中序遍历过程中记录前一节点的数值,当前节点大于中序遍历前一节点的数值,就是合法的二叉搜索树。
点赞 回复 分享
发布于 2019-08-28 18:15
刚才写了一波,发现写错了,囧。
点赞 回复 分享
发布于 2019-08-28 18:14

相关推荐

05-12 10:10
已编辑
门头沟学院 人工智能
写这篇之前我犹豫了挺久。一方面是怕被人骂,&quot;又一个收割焦虑的转行帖&quot;;另一方面是看了太多用&nbsp;GPT&nbsp;套娃出来的「学习路线」文章,AI&nbsp;味重得让人没法读完。所以这篇全是亲身踩过的坑,时间线、用过的项目、当时的心路全都尽量原样写出来。如果你是大学生在迷茫要不要转&nbsp;AI,或者已经在转的路上,希望能给点参考。&nbsp;一个反共识的开场:你以为进&nbsp;OpenAI&nbsp;的人都是博士?&nbsp;先讲个故事,跟我没关系,但跟所有想转&nbsp;AI&nbsp;的人都有关系。&nbsp;OpenAI&nbsp;的&nbsp;Sora&nbsp;团队(就是搞文生视频那个)一共&nbsp;13&nbsp;个人。这里面有两个人特别有意思:&nbsp;Will&nbsp;DePue,密歇根大学计算机系,直接辍学了。17...
_hengheng:我也本,也算是做ai相关,我最开始感觉做ai工程师有多么多么困难,后来发现懂了原理后整体训练完全可以看成一个流程化的内容,开源方案太多了,大多基本都是按着模子在自家业务上做各种操作,就算是大厂的小部门也没那么多资源去训基模,反而更多的是像怎么把技术往业务方向靠近了,不过当前时代如果本科学历没那么好加上自己执行力不是特别强还真不建议走ai工程师这条路,可以试试其他ai的偏业务方向,不然校招不太好杀出来
点赞 评论 收藏
分享
04-28 15:42
郑州大学 C++
找工作勤劳小蜜蜂:网易这几个月在大面积裁员,外包岗全退,今年网易收缩严重,建议慎重考虑网易
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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