标签:next 个数 one 题目 搜索 lse 否则 tin start
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
后序遍历序列的最后一个元素为二叉树的根节点;
二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根
1 public static boolean VerifySquenceOfBST(int [] sequence) { 2 if(sequence.length==0){ 3 return false; 4 } 5 if(sequence.length==1){ 6 return true; 7 } 8 return judge(sequence,0,sequence.length-1); 9 } 10 public static boolean judge(int[] arr,int start,int end ) { 11 if (start >= end) { 12 return true; 13 } 14 int i = start; 15 //找到左右支树临界点,即右支树的第一个节点索引为i 16 while (arr[i] < arr[end]) { 17 i++; 18 } 19 //若右支树节点小于根节点,则false 20 for (int j = i; j < end; j++) { 21 if (arr[j] < arr[end]) { 22 return false; 23 } 24 } 25 //左右支树均符合才true 26 return judge(arr, 0, i - 1) && judge(arr, i, end - 1); 27 }
讨论区大佬写这道题的例子时发现二叉树的中序序列和后序序列就满足栈的压入弹出序列关系。即如果把中序序列当做栈的压入序列,那么后序序列是该栈的一个弹出序列。 而BST的中序是排序数组。因此将本题的序列排序作为中序序列,引用“栈的压入、弹出序列”题的答案判断两序列是否满足上述关系即可
1 public static boolean VerifySquenceOfBST01(int [] sequence) { 2 int[] arr = sequence.clone(); 3 Arrays.sort(arr); 4 return IsPopOrder(arr,sequence); 5 } 6 public static boolean IsPopOrder(int[] pushA,int[] popA){ 7 if(pushA.length==0||popA.length==0){ 8 return false; 9 } 10 int popIndex=0; 11 Stack<Integer> stack = new Stack<>(); 12 for(int i=0;i<pushA.length;i++){ 13 stack.push(pushA[i]); 14 while (!stack.isEmpty()&&stack.peek()==popA[popIndex]){ 15 stack.pop(); 16 popIndex++; 17 } 18 } 19 return stack.isEmpty(); 20 }
测试:
1 public static void main(String[] args) { 2 Scanner x=new Scanner(System.in); 3 while(x.hasNext()){ 4 //输入m个数字,以空格隔开 5 int m=x.nextInt(); 6 int[] number=new int[m]; 7 for(int i=0;i<m;i++){ 8 number[i]=x.nextInt(); 9 } 10 System.out.println(Arrays.toString(number)); 11 boolean b = VerifySquenceOfBST(number); 12 System.out.println(b); 13 } 14 输入: 15 4 16 7 4 6 5 17 输出: 18 [7, 4, 6, 5] 19 false
标签:next 个数 one 题目 搜索 lse 否则 tin start
原文地址:https://www.cnblogs.com/Blog-cpc/p/12343103.html