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