面试题33:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如,输入数组{5,7,6,9,11,10,8},则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},则由于没有哪棵二叉搜索数的后序遍历结果是这个序列,因此返回false。
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
struct BinaryTreeNode {
int value;
BinaryTreeNode* left;
BinaryTreeNode* right;
};
// 判断后序序列
bool VerifySquenceOfBST(int sequence[], int length){
if(sequence==NULL || length<=0) return false;
int root=sequence[length-1];
// 在二叉搜索树中左子树节点的值小于根节点的值
int i=0;
for(;i<length-1;i++){
if(sequence[i]>root) break;
}
// 在二叉搜索树中右子树节点的值大于根节点的值
int j=i;
for(;j<length-1;j++){
if(sequence[j]<root) return false;
}
// 判断左子树是不是二叉搜索树
bool left=true;
if(i>0) left=VerifySquenceOfBST(sequence, i);
// 判断右子树是不是二叉搜索树
bool right=true;
if(i<length-1) right=VerifySquenceOfBST(sequence+i, length-i-1)
return (left&&right);
}
// 类似问题:判断前序序列
bool VerifySquenceOfBST2(int sequence[], int length){
if(sequence==NULL || length<=0) return false;
int root=sequence[0];
// 在二叉搜索树中左子树节点的值小于根节点的值
int i=1;
for(;i<length;i++){
if(sequence[i]>root) break;
}
// 在二叉搜索树中右子树节点的值大于根节点的值
int j=i;
for(;j<length;j++){
if(sequence[j]<root) return false;
}
// 判断左子树是不是二叉搜索树
bool left=true;
if(i>1) left=VerifySquenceOfBST2(sequence+1, i-1);
// 判断右子树是不是二叉搜索树
bool right=true;
if(i<length) right=VerifySquenceOfBST2(sequence+i, length-i)
return (left&&right);
}
int main() {
return 0;
}