題目:
一棵二叉查找樹,得到一個後序遍歷,判斷這個後序遍歷是否正確。
分析:
方法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;
}
總結:
面試中會經常出現二叉樹方面的題目,這種題目,要學會挖掘二叉樹中的特徵,學會用特徵進行解題。