

题目
解决代码及点评
/*
给出一个数组,判断该数组是否为二叉搜索树的后序遍历
后序遍历是先遍历左子树,再遍历右子树,最后访问根节点
所以,后序遍历的特点是,最后一个元素是根节点
在数组剩下的部分里,某连续的部分P1小于根节点,而某连续的部分P2全部大于根节点
对P1和P2来说,分别是两个子树的后序遍历,因此使用递归即可
*/
#include <iostream>
using namespace std;
/* 判断是否后序遍历序列 */
static bool VerifyArrayOfBST(int* a, int len)
{
int root = a[len - 1]; // 最后一个节点是根节点
int i, j;
bool result;
// 对于只有小于两个节点的树来说,我们认为其是后序遍历序列
if (len <= 2) return true;
// 循环找到第一个大于根节点的下标
for (i = 0; i < len-1; ++i)
{
if (a[i] > root)
break;
}
// 在这个大于根节点的下标后面的所有数据,应该都大于root
// 否则它不是后序遍历序列
for (j = i; j < len - 1; ++j)
{
if (a[j] < root)
return false;
}
// 递归的检测左子树
result = VerifyArrayOfBST(a, i);
// 如果左子树成功,则检测右子树,并返回
if (result)
return VerifyArrayOfBST(a + i, len - i - 1);
// 左子树都不成功,则返回false
return false;
}
// 测试的main函数
int main()
{
int a[]={1,6,4,3,5};
int a1[]={7,6,4,3,5};
if (VerifyArrayOfBST(a,5)==true)
{
cout<<"a是搜索树"<<endl;
}
else{
cout<<"a不是搜索树"<<endl;
}
if (VerifyArrayOfBST(a1,5)==true)
{
cout<<"a1是搜索树"<<endl;
}
else{
cout<<"a1不是搜索树"<<endl;
}
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.youkuaiyun.com/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果