码迷,mamicode.com
首页 > 其他好文 > 详细

【剑指Offer】23、二叉搜索树的后序遍历序列

时间:2020-02-21 22:21:03      阅读:58      评论:0      收藏:0      [点我收藏+]

标签: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

 

【剑指Offer】23、二叉搜索树的后序遍历序列

标签:next   个数   one   题目   搜索   lse   否则   tin   start   

原文地址:https://www.cnblogs.com/Blog-cpc/p/12343103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!