判断一个后序遍历是否正确

题目:

一棵二叉查找树,得到一个后序遍历,判断这个后序遍历是否正确。

分析:

方法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;
}

总结:

面试中会经常出现二叉树方面的题目,这种题目,要学会挖掘二叉树中的特征,学会用特征进行解题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章