剑指Offer23二叉搜索树的后序遍历序列
Posted blog-cpc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer23二叉搜索树的后序遍历序列相关的知识,希望对你有一定的参考价值。
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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
以上是关于剑指Offer23二叉搜索树的后序遍历序列的主要内容,如果未能解决你的问题,请参考以下文章
剑指Offer 23. 二叉搜索树的后序遍历序列 (二叉搜索树)