首页 > 试题广场 >

二叉搜索树

[编程题]二叉搜索树
  • 热度指数:15302 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
判断两序列是否为同一二叉搜索树序列

输入描述:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。


输出描述:
如果序列相同则输出YES,否则输出NO
示例1

输入

2
567432
543267
576342
0

输出

YES
NO
Java
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String s = preOrderString(scanner.next());
        for (int i = 0; i < n; i++) {
            String s1 = preOrderString(scanner.next());
            System.out.println(s.equals(s1)?"YES":"NO");
        }
    }

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    static void creat(TreeNode root, int v){
        if (v<root.val){
            if (root.left==null) root.left = new TreeNode(v);
            else creat(root.left,v);
        }else {
            if (root.right==null) root.right= new TreeNode(v);
            else creat(root.right,v);
        }
    }
    static void preOrder(TreeNode root,StringBuilder builder) {
        if (root != null) {
            builder.append(root.val);
            preOrder(root.left,builder);
            preOrder(root.right,builder);
        }
    }
    
    static String preOrderString(String s){
        char[] tree = s.toCharArray();
        TreeNode root = new TreeNode(tree[0]);
        for (int i = 1; i < tree.length; i++) creat(root,tree[i]);
        StringBuilder builder = new StringBuilder();
        preOrder(root,builder);
        return builder.toString();
    }
}




编辑于 2020-03-20 09:45:43 回复(0)
提供另一种思路:
1、这是一棵二叉排序树,那么第一个数就是树根,先输出树根,将剩下的和树根比较,分成大于树根和小于树根的两堆有序的数。
2、将这两堆树按步骤一递归,(小于树根那堆数中,第一个数就是根节点的左孩子;大于树根那堆数中,第一个数就是根节点的右孩子)
3、如果两个序列的输出结果相同,则这两个序列构成的二叉排序树是一样的。

附代码:
import java.util.ArrayDeque;
import java.util.Scanner;

public class Main {

    //对序列进行前序遍历
    public String printTree(ArrayDeque<Integer> alternativeTree){
        if (alternativeTree.isEmpty()){
            return "";
        }else {
            String result = "";
            int topNode = alternativeTree.poll();
            result += topNode;
            ArrayDeque<Integer> smaller = new ArrayDeque<>();
            ArrayDeque<Integer> larger = new ArrayDeque<>();
            int size = alternativeTree.size();
            for (int i=0;i<size;i++){
                int curNode = alternativeTree.poll();
                if (curNode>topNode){
                    larger.add(curNode);
                }else if(curNode<topNode){
                    smaller.add(curNode);
                }
            }
            return result + printTree(smaller) + printTree(larger);
        }
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        Main instance = new Main();
        //将第一个序列按自定义规则输出
        int judgeNum = Integer.parseInt(input.nextLine());
        String accordingTree = input.nextLine();
        ArrayDeque<Integer> accordingDeque = new ArrayDeque<>();
        for(int j=0;j<accordingTree.length();j++){
            accordingDeque.add(Integer.parseInt(accordingTree.charAt(j)+""));
        }
        String accor = instance.printTree(accordingDeque);
        //将后面需要比较的序列分别按自定义规则输出并将输出结果与第一个序列比较
        for (int i=0;i<judgeNum;i++){
            ArrayDeque<Integer> deque = new ArrayDeque<>();
            String alternative = input.nextLine();
            for (int j=0;j<alternative.length();j++){
                deque.add(Integer.parseInt(alternative.charAt(j)+""));
            }
//            System.out.println(instance.printTree(accordingDeque));
//            System.out.println(instance.printTree(deque));
            //System.out.println(instance.printTree(accordingDeque).equals(instance.printTree(deque))?"YES":"NO");
            System.out.println(accor.equals(instance.printTree(deque))?"YES":"NO");
        }
    }
}
发表于 2018-12-08 11:08:22 回复(0)