劍指offer 33:二叉搜索樹的後序遍歷序列

題意

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。二叉搜索樹就是這個二叉樹的左子樹的所有節點都比根節點小,右子樹的所有節點都比根節點大。我們知道後序遍歷的最後一個節點一定是根節點,因此根據根節點和二叉搜索樹的大小關係,可以將序列從頭開始和根節點比較,小的就是左子樹,大的就是右子樹。依次做下去,就能判斷出是否是二叉搜索樹。

思路

bool VerifySquenceOfBST(vector<int> sequence) {
        return post_array(sequence,0,sequence.size()-1);
    }
    bool post_array(vector<int> a, int start, int end) {
        int i = 0, j = 0;
      //當樹只有一個節點的時候,一定是平衡樹
        if (start == end)
            return true;
      //以根節點爲基礎,找到比根節點小的左子樹的所有元素
        for (i = start; i < end; i++) {
            if (a[i] > a[end])
                break;
        }
      //與左子樹相同,找到右子樹
        for (j = i; j < end; j++)
            if (a[j] < a[end])
                break;
      //如果右子樹裏面有比根節點小的,說明不是平衡樹
        if (j != end)
            return false;
        //這裏必須初始化爲true,否則在不執行下面其中之一的判斷是,會導致程序錯誤
        bool left = true,right = true;
      //對找到的左子樹和右子樹遞歸查找
        if(i>start)
          //這裏我一開始弄成了start+i-1,後來發現i是以start開始的
            left = post_array(a,start,i-1);
        if(i < end)
            right = post_array(a,i,end-1);
        return left && right;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章