判斷一個後序遍歷是否正確

題目:

一棵二叉查找樹,得到一個後序遍歷,判斷這個後序遍歷是否正確。

分析:

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

總結:

面試中會經常出現二叉樹方面的題目,這種題目,要學會挖掘二叉樹中的特徵,學會用特徵進行解題。

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