劍指offer 二叉搜尋樹的後序遍歷序列

2021-08-27 05:30:14 字數 1521 閱讀 7678

題目:輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果,如果是則返回true,否則返回false。假設輸入的陣列任意兩個數字都互不相同。

思想;

首先要知道二叉搜尋樹的特點,然後再來進行判斷,對於二叉搜尋樹其本質也是乙個二叉樹,只不過對於其乙個結點,其左子樹均小於該結點,右子樹均大於該結點

然後後序遍歷的話,那麼最後乙個結點必定是該二叉搜尋樹的根節點,如圖:

對於該二叉搜尋樹,其左子樹的值均小於根結點,右子樹的值均大於根結點。

所以可以對於乙個二叉搜尋樹,可以現將其根節點標記出來,再判斷左子樹是不是都小於根節點,求其左子樹,然後剩餘的就是右子樹了,判斷右子樹的時候,要判斷剩下的資料是不是都大於根節點,如果都大於根節點的話,然後再對其左子樹和右子樹分別進行判斷是不是乙個二叉搜尋樹。直到判斷到根結點。

求左子樹的長度,當大於根節點時跳出迴圈,

如果左子樹長度為0的話,則說明只有右子樹,就只判斷右子樹即可。

右子樹有小於根節點的直接返回false.結束程式。

**:

//正確 true

//錯誤 false

bool verifysquenceofbst(int* arr, int

length)

//空樹也是二叉搜尋樹的後序序列

if (length == 0)

int root = arr[length - 1];

int left = 0;

int right = 0;

//求其左子樹的長度

for (left = 0; left < length - 1; left++)

}//判斷右子樹是不是全都小於根節點

if (left < length - 1) //具有右結點}}

bool left_result = verifysquenceofbst(arr, left);

bool right_result = verifysquenceofbst(arr + left, length - left - 1);

//在判斷左子樹和右子樹是不是乙個二叉搜尋樹

return (left_result && right_result);

}

測試用例:

功能測試:(輸入的後序遍歷的序列對應一顆二叉樹,包括完全二叉樹,所有結點都沒有左/右子樹的二叉樹,只有乙個結點的二叉樹;輸入的後序遍歷沒有乙個對應的二叉樹)

特殊輸入測試(指向後序遍歷序列的指標為null指標)

測試:

int main()

; bool result = verifysquenceofbst(arr, sizeof(arr) / sizeof(arr[0]));

if (result)

else

return

0;}

劍指Offer 二叉搜尋樹的後序遍歷

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。author zy date 2017年10月13日 下午9 34 21 decription 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如...

劍指offer 二叉搜尋樹的後序遍歷

時間限制 1秒 空間限制 32768k 熱度指數 524747 本題知識點 棧 樹輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。這兩天狀態不行,沒多大刷題的動力。菜還不想動,說的大概就是我了。遞迴 大佬的思路...

劍指offer 二叉搜尋樹的後序遍歷

題目描述 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。簡單思路 二叉搜尋樹 1.左孩子 根 右孩子 2.bst的左孩子和右孩子都是bst 發現對於每一棵子樹,它的根結點總是對應該子樹的後序序列的最後乙個數 ...