剑指Offer——面试题33:二叉搜索树的后序遍历序列

面试题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;
}
发布了42 篇原创文章 · 获赞 43 · 访问量 1059

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104423124