題目描述:
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
二叉搜索樹相關知識點:
1.左子樹上所有節點的key值都小於或等於根節點。 2.右子樹上所有節點的key值都大於或等於根節點。3.中序遍歷二搜索樹將得到有序數組。4.查找所需的最大次數等同於二叉查找樹的高度。
注意:二叉搜索樹不一定是平衡二叉樹;
解題思路:
後序遍歷二叉搜索樹的最後一個元素是二叉搜索樹的根節點,並且從後序遍歷序列的開始會存在連續序列小於(或等於)根節點的數值,剩餘的連續元素數值應該不小於根節點的數值;否則將不是二叉搜索樹的後序遍歷序列;遞歸地判斷小於(或等於)根節點的連續序列以及剩餘的不小於根節點的連續序列是否符合上述二叉搜索樹後續遍歷序列的特點,從而解決問題。
拓展:二叉搜索樹先序遍歷序列的判斷思路類似,只是根節點的元素爲序列的開頭元素。
通過代碼:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
vector<int> leftSeq;
vector<int> rightSeq;
int len = sequence.size();
int rootNum = sequence[len - 1];
int i = 0;
for(;i < len - 1; ++i)
{
if(sequence[i] > rootNum)
break;
leftSeq.push_back(sequence[i]);
}
for(int j = i; j < len - 1; ++j)
{
if(sequence[j] < rootNum)
return false;
rightSeq.push_back(sequence[j]);
}
bool leftResult = true;
if(!leftSeq.empty())
{
leftResult = VerifySquenceOfBST(leftSeq);
}
bool rightResult = true;
if(!rightSeq.empty())
{
rightResult = VerifySquenceOfBST(rightSeq);
}
return leftResult && rightResult;
}
};