二叉搜索树的后序遍历序列

题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

分析:如图,一棵 BST :左孩子 < 根结点 < 右孩子,一棵 BST 的左子树或者右子树都是 BST。

后序遍历是,左右根:[3, 4, 9, 5, 12, 11, 10],结合图再从左往右分析后序序列,分析子树,可以发现:

[3, 4, 9, 5] 10 [12, 11]

  • [3, 4] 5 [9]
    • [3] 4
  • [12] 11

发现对于每一棵子树,它的根结点总是对应该子树的后序序列的最后一个数,

那么,只需要不断地确定出左子树区间和右子树区间,并且判断:左子树区间的所有结点值 < 根结点值 < 右子树区间所有结点值,这个条件是否满足即可。

 

 

PS:与牛客相同!

代码:

 

第二种解法:二叉树的中序序列和后序序列满足栈的压入弹出序列关系,即如果把中序序列当做栈的压入序列,那么后序序列是该栈的一个弹出序列。而BST的中序是排序数组。因此将本题的序列排序作为中序序列,判断两序列是否满足上述关系即可。

 
 1 import java.util.Stack;
 2 import java.util.Arrays;
 3  
 4 public class Solution {
 5     public boolean VerifySquenceOfBST(int [] seq) {
 6         int[] arr = seq.clone();
 7         Arrays.sort(arr);
 8         return IsPopOrder(arr,seq);
 9          
10     }
11 //判断第二个序列是否可能为第一个序列的弹出顺序,引用的“栈的压入、弹出序列”题目的答案
12 public boolean IsPopOrder(int [] pushA,int [] popA) {
13         if(pushA.length == 0 || popA.length == 0)
14             return false;
15         Stack<Integer> s = new Stack<Integer>();
16         //用于标识弹出序列的位置
17         int popIndex = 0;
18         for(int i = 0; i< pushA.length;i++){
19             s.push(pushA[i]);
20             //如果栈不为空,且栈顶元素等于弹出序列
21             while(!s.empty() &&s.peek() == popA[popIndex]){
22                 //出栈
23                 s.pop();
24                 //弹出序列向后一位
25                 popIndex++;
26             }
27         }
28         return s.empty();
29     }
30 }

 

posted on 2020-08-28 22:25  _那些你很冒险的梦  阅读(233)  评论(0)    收藏  举报

导航