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; } }
浙公网安备 33010602011771号