L2-004 这是二叉搜索树吗? (25分)
 

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数 N(1000)。随后一行给出 N 个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出 YES ,然后在下一行输出该树后序遍历的结果。数字间有 1 个空格,一行的首尾不得有多余空格。若答案是否,则输出 NO

输入样例 1:

7
8 6 5 7 10 8 11
 

输出样例 1:

YES
5 7 6 8 11 10 8
 

输入样例 2:

7
8 10 11 8 6 7 5
 

输出样例 2:

 

YES
11 8 10 7 5 6 8
 

输入样例 3:

7
8 6 8 5 10 9 11


 

输出样例 3:

NO


import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Node{
    int val;
    Node left;
    Node right;
    public Node() {
    }
    public int getVal() {
        return val;
    }
    public void setVal(int val) {
        this.val = val;
    }
    public Node getLeft() {
        return left;
    }
    public void setLeft(Node left) {
        this.left = left;
    }
    public Node getRight() {
        return right;
    }
    public void setRight(Node right) {
        this.right = right;
    }
}
public class Main {     
    static String res="";
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int li[]=new int[n];
        for(int i=0;i<n;i++)
            li[i]=sc.nextInt();
        Node root1=erCha(li);
        if(nodeNum(root1)==n) {
            System.out.println("YES");
            post(root1);
            System.out.println(res.trim());
            return;
        }
        
        Node root2=erChaJX(li);
        if(nodeNum(root2)==n) {
            System.out.println("YES");
            post(root2);
            System.out.println(res.trim());
            return;
        }        
        System.out.println("NO");        
    }
    static int nodeNum(Node node) {
        Queue<Node> queue=new LinkedList<Node>();
        queue.add(node);
        int num=0;
        while(!queue.isEmpty()) {
            Node temp=queue.poll();
            num++;
            if(temp.left!=null)
                queue.add(temp.left);
            if(temp.right!=null)
                queue.add(temp.right);
        }
        return num;
    }
    static void post(Node node) {
        if(node==null)
            return ;
        post(node.left);
        post(node.right);
        res=res+node.val+" ";
        
    }
    static Node erCha(int li[]) {
        if(li.length==0)
            return null;
        Node root=new Node();
        root.val=li[0];
        if(li.length==1)
            return root;
        int rflag=1;
        for(int i=1;i<li.length;i++) {
            if(li[0]>li[i])
                rflag++;
            else 
                break;
        }
        root.left=erCha(Arrays.copyOfRange(li, 1, rflag));
        int lflag=rflag;
        for(int i=rflag;i<li.length;i++) {
            if(li[0]<=li[i])
                lflag++;
            else 
                break;
        }
        root.right=erCha(Arrays.copyOfRange(li, rflag, lflag));
        return root;
    }    
    static Node erChaJX(int li[]) {
        if(li.length==0)
            return null;
        Node root=new Node();
        root.val=li[0];
        if(li.length==1)
            return root;
        int rflag=1;
        for(int i=1;i<li.length;i++) {
            if(li[0]<=li[i])
                rflag++;
            else 
                break;
        }
        root.left=erChaJX(Arrays.copyOfRange(li, 1, rflag));
        int lflag=rflag;
        for(int i=rflag;i<li.length;i++) {
            if(li[0]>li[i])
                lflag++;
            else 
                break;
        }
        root.right=erChaJX(Arrays.copyOfRange(li, rflag, lflag));
        return root;
    }
}

 





posted on 2020-07-06 10:17  第一帅程序猿  阅读(42)  评论(0)    收藏  举报