天天看點

搜尋二叉樹的後續周遊序列

給出一個數組,該如何判定是否為一個搜尋二叉樹的後續周遊序列呢

首先來看搜尋二叉樹的滿足條件:

  • 節點左孩子的關鍵碼小于根節點
  • 節點右孩子的關鍵碼大于根節點
  • 節點的關鍵碼key  都互不相同
  • 左右子樹都是一顆二叉搜尋樹

這樣我們很容易給出一個範例如下圖:

搜尋二叉樹的後續周遊序列
搜尋二叉樹的後續周遊序列

我們可以得出其後續周遊序列為: 0 2 1 4 3 69 8 7 5

我們這裡以數組{0,2,1,4,3,6,9,8,7,5}為例

我們知道,後續周遊序列的最後一個節點的數字 5 就是根節點的值,在這個數組中,

搜尋二叉樹的後續周遊序列

可以看到前五個數組都比5小,因為為值為5的節點的左子樹節點,後四個都比5大,因為為值為5的節點的右子樹節點

搜尋二叉樹的後續周遊序列

接下來我們用同樣的方法确定數組每一部分對應的字樹結構,這樣就成了一個遞歸問題,

搜尋二叉樹的後續周遊序列
搜尋二叉樹的後續周遊序列
搜尋二叉樹的後續周遊序列

找到這樣的規律之後我們就可以寫出如下代碼:

bool Part(vector<int> sequence, int begin, int size)

{

if (size <= 0)

return false;

int root = sequence[size - 1];

int i = begin;

for (; i<size - 1; ++i)

{

if (sequence[i]>root)

break;

}

int j = i;

for (; j<size - 1; ++j)

{

if (sequence[j]<root)

return false;

}

bool left = true;

if (i>begin)

left = Part(sequence, begin, i);

bool right = true;

if (i<size - 1)

right = Part(sequence, begin + i, size-1);

return left&&right;//左右有一個不符合則傳回false

}

bool VerifySquenceOfBST(vector<int> sequence)  {

return Part(sequence, 0, sequence.size());

}

繼續閱讀