二叉搜尋樹的後序遍歷序列

weixin_33935777發表於2018-11-08

給定一個序列,判斷是不是一個二叉搜尋樹的後序遍歷序列

思路:由後序遍歷的特點我們知道,陣列最後一個數字是根節點,前面的序列是其左右子樹。從頭開始查詢第一個比根節點大的位置,就是右子樹的根節點,它也是左右子樹序列的分界點。應當滿足從分界點往後一直到倒數第二個數值都比最後一個(根節點)大。反覆迭代。


13880937-697c3af4a62a7672.png
順序流程.png
bool VerifyHelper(vector<int> seq, int start, int len)
{
    int root = seq[len-1];
    int i = 0;

    for(; i<len-1; ++i)
      if(seq[i] > root)
        break; // 找到分界點

      int j = i;
      for(; j<len-1; ++j)
        {
          if(seq[j] < root)
            return false; // 右子樹比root小,不是後序
        }
      // 檢查左右子樹
      bool left = true;
      if(i > 0)
        left = VerifyHelper(seq, start, i);

      bool right = true;
      if(i<len-1)
        right = VerifyHelper(seq, i, len-1);

      return left&right;
}
bool VerifyPostOrder(vector<int> sequence)
{
    if(sequence.size() == 0)
       return false;
    int len = sequence.size();
    return VerifyHelper(sequence, 0 , len);
}

相關文章