TreePostoederTraversal

题目描述[原题链接][https://www.acwing.com/problem/content/description/44/]

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则返回true,否则返回false

假设输入的数组的任意两个数字都互不相同。

样例

1
2
3
输入:[4, 8, 6, 12, 16, 14, 10]

输出:true

算法描述

后序遍历序列的最后一个元素就是二叉树的根节点,根据二叉搜索树的特点,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值;所以每次找到节点的左右子树的分割点,判断两端的数据是否满足性质

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:

vector<int> seq;

bool verifySequenceOfBST(vector<int> sequence) {
seq=sequence;
if(seq.size()==0)return true;
return dfs(0,seq.size());
}

bool dfs(int l,int r){
if(l>=r)return true;
int k=l;
int root=seq[r];
while(k<=r&&seq[k]<root)k++;
for(int i=k;i<r;i++){
if(seq[i]<root)return false;
}
return dfs(l,k-1)&&dfs(k,r-1);
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public boolean verifySequenceOfBST(int [] sequence) {
if(sequence.length==0)return true;
return dfs(0,sequence.length-1,sequence);
}

public boolean dfs(int l,int r,int[] seq){
if(l>=r)return true;
int k = l;
int root = seq[r];
while(k<r&&seq[k]<root)k++;
for(int i=k;i<r;i++)
if(seq[i]<root)return false;
return dfs(l,k-1,seq)&&dfs(k,r-1,seq);
}
}