题目:
一棵二叉查找树,得到一个后序遍历,判断这个后序遍历是否正确。
分析:
方法1,根据中序和后序
根据中序和后序,可以唯一得到一棵二叉树。一棵二叉查找树的中序显然就是所有数字的正常排序,所以,我们首先将所有的后序得到的数字排序,时间复杂度是O(nlogn),然后根据后序和中序遍历,判断二叉树是否可以建立。
总的时间复杂度就是O(nlogn)。
方法2,直接利用查找二叉树的性质
显然,后序遍历的最后一个数字是根节点,然后根据查找二叉树的性质,我们将前面的数字分为两部分,前面一部分都是小于根节点的数字,后面的数字都是大于根节点的数字。然后用递归的方法,判断是否是正确的查找二叉树后序遍历。
代码如下:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
bool verifyBST(int *a, int len)
{
if(a == NULL || len < 0)
return false;
if(len == 0) //如果长度为0,返回正确
return true;
int i = 0;
while(i < len - 1) //找到第一个大于根节点的数字
{
if(a[i] > a[len - 1])
break;
i++;
}
int j = i;
while(j < len - 1) //判断右边部分的数字是否都大于根节点
{
if(a[j] < a[len - 1])
return false;
j++;
}
return verifyBST(a, i) && verifyBST(a + i, len - i - 1); //递归调用,判断左边和右边数字是否满足条件
}
int main()
{
int a[] = {1,2,4,5,6,3};
cout << verifyBST(a, sizeof(a)/sizeof(a[0])) <<endl;
return 0;
}
总结:
面试中会经常出现二叉树方面的题目,这种题目,要学会挖掘二叉树中的特征,学会用特征进行解题。