題目:輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果,如果是則返回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 發現對於每一棵子樹,它的根結點總是對應該子樹的後序序列的最後乙個數 ...