• PTA— 04-树4 是否同一棵二叉搜索树(25 分)【java语言实现】


    04-树4 是否同一棵二叉搜索树(25 分)【java语言实现】

    给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

    输入格式:

    输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。
    简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

    输出格式:

    对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
    输入样例:

    
    4 2
    3 1 4 2
    3 4 1 2
    3 2 4 1
    2 1
    2 1
    1 2
    0

    输出样例:

    Yes
    No
    No

    思路

    按照 小白专场中的代码用java 重写即可,需要注意一些小细节。

    代码

    
    import java.util.Scanner;
    
    class BinarySearchTree{
        int value;
        BinarySearchTree left;
        BinarySearchTree right;
    
        int flag;
    
        /**
         * 够着函数,用于初始化
         *
         * https://blog.csdn.net/zjkC050818/article/details/53730108
         * @param value
         */
        public BinarySearchTree(int value){
            this.value = value;
            left = null;
            right = null;
            flag =0;
        }
    }
    
    public class Main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner sc=new Scanner(System.in);
            int length=sc.nextInt();
            int N=0;
            BinarySearchTree root=null;
            while(length!=0){
                N=sc.nextInt();
                //建树
                root=buildTree(sc,length);
                //判断是否同一棵树,把结果存储到一棵树中
                boolean[] arr=new boolean[N];
                for(int i=0;i<N;i++){
                    arr[i]=judge(root,sc,length);
                    reset(root);
                }
    
                for(int j=0;j<N;j++){
                   if(arr[j])
                        System.out.println("Yes");
                    else
                        System.out.println("No");
                }
               // sc.nextInt();
                length=sc.nextInt();
            }
    
        }
    
    
        /**
         * 检测函数,这个不懂
         * @param value
         * @param t
         * @return
         */
        public static boolean check(int value,BinarySearchTree t){
            if (t.flag == 0){
                if (value == t.value){
                    t.flag =1;
                    return true;
                }
                else
                    return false;
            }
            if (value>t.value){
                return check(value,t.right);
            }
            if (value<t.value){
                return check(value,t.left);
            }
            else {
                t.flag =1;
                return true;
            }
        }
    
        /**
         * 建立二叉搜索树
         * @param sc
         * @param length
         * @return
         */
        public  static  BinarySearchTree buildTree(Scanner sc,int length){
            BinarySearchTree root = null;
            int tem;
            for (int i=0;i<length;i++){
                tem = sc.nextInt();//读入
                root = insert(tem,root);
            }
    
            return root;//返回根结点
        }
    
        /**
         * 插入结点
         * @param value
         * @param t
         * @return
         */
        public static  BinarySearchTree insert(int value,BinarySearchTree t){
            if (t == null){/**如果为null,则实例化结点*/
                return new BinarySearchTree(value);
            }
            else {
                if (value>t.value){
                    t.right = insert(value,t.right);
                }
                else if (value<t.value){
                    t.left = insert(value,t.left);
                }
                /**如果已经存在,则什么都不做*/
            }
    
            return t;
        }
    
        /**
         * 判断是否合格,一个一个的 check
         * @param root
         * @param sc
         * @param length
         * @return
         */
        public static boolean judge(BinarySearchTree root,Scanner sc,int length) {
            int temp;
            boolean flag = true;/**false 表示还是一致的*/
            for (int j = 0; j < length; j++) {
                temp = sc.nextInt();
                if (!check(temp, root)) {
                    //需要继续打印
                    j++;//因为这里在for 循环本应该加1 的,但是被耽误了,不加一就会出现错位
                    while (j < length) {
                        int x= sc.nextInt();
                        j++;
                    }
                    return false;
                }
            }
            return true;
        }
    
        /**
         * 重置 二叉树中的 flag
         * @param root
         */
        public static void reset(BinarySearchTree root){
            if (root.left != null)
                reset(root.left);
            if (root.right != null)
                reset(root.right);
            root.flag =0;
        }
    
    }
    
    
    

    参考博客:zjkC050818的博客

  • 相关阅读:
    《未来简史》一、主导世界力量的形成与崩塌
    《小岛经济学》九、美岛应对危机——汽油救火
    《小岛经济学》八、金本位的破灭、房地产的泡沫
    《小岛经济学》七、美国的生命线正是我们中国
    《小岛经济学》六、政府手中的魔术棒
    《小岛经济学》五、政府与央行的上帝之手
    《小岛经济学》四、最成功的栽赃——通货紧缩
    《小岛经济学》三、是什么在拉动经济的增长
    11.boolean类型
    10.整形数据类型
  • 原文地址:https://www.cnblogs.com/HuanChen1025/p/8999270.html
Copyright © 2020-2023  润新知