二叉搜索樹的后序遍歷序列

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。


一個二叉樹結構是不能僅僅根據后續遍歷確定的,但是題目中的二叉樹是二叉搜索樹,二叉搜索樹的性質是節點左子樹的值一定小于根節點,右子樹的值一定都大于根節點,后續遍歷的順序是先左然后右最后根節點,所以序列的最后一個元素一定是根節點。曾想過既然最后一個元素是根節點,自己能不能根據二叉搜索樹的性質和給定的序列能否構建出一個搜索樹呢。比如給定測試序列[4,8,6,12,16,14,10],其中10是根節點,14大于10所以14應該在10的右子樹,16大于14,16位于14的右子樹,12大于10小于14所以位于14的左子樹...... 就這樣構建,完成后然后在進行一次后序遍歷然后和給定的序列進行比較是否一致。但是這樣實在太麻煩了。而且題目中沒有給定樹的結構,說明題目不需要進行先構建二叉搜索樹然后進行后序遍歷再比較序列的一致性來求解。所以還是考慮二叉搜索樹的性質和樹的遞歸結構,二叉搜索樹的節點除了大小性質外,每個子樹同樣是二叉搜索樹。所以完全可以遞歸求解。求解思路:如果給定的序列符合,根據后續的遍歷一定可以找到根節點的左子樹的遍歷序列和右子書的遍歷序列。左邊的都一定比根節點小,右邊的都比根節點大,有一個不符合就返回false。如果符合就遞歸的求解左序列和右序列。如果每次遞歸都符合說明給定序列符合條件。其中遇到的一個問題是如果序列為空應該怎么判斷,因為一個二叉搜索樹僅僅有左子樹或者右子樹是可能的,所以我之前判斷如果序列元素的數量小于等于1應該返回true。但是如果第一次輸入給函數的時候就是空序列,顯然是不應該返回true的。所以如果序列為空返回false,后面進行遞歸之前如果子序列為空就不遞歸來實現。

function VerifySquenceOfBST($sequence)
{
        // write code here
    $flag = true;
    if(count($sequence)==0){
        return false;
    }
    if(count($sequence)==1){
        return true;
    }
    else{
        $root_val = end($sequence);
        $less_max_idx = -1 ;
        $left = array();
        $right = array();
        for($i = 0;$i < count($sequence);$i++){
            if($sequence[$i]<$root_val){
                $less_max_idx = $i;
            }
        }
        for($i = 0;$i<count($sequence)-1;$i++){
            if($i<=$less_max_idx){
              $left[] = $sequence[$i];
            }else{
               $right[] = $sequence[$i]; 
            }
        }
        //驗證左子樹,必須都比根節點小
        for($i =0;$i<count($left);$i++){
            if($left[$i] > $root_val){
                return false;
            }
        }
        for($i = 0; $i<count($right); $i++){
            if($right[$i] < $root_val){
                return false;
            }
        }
        if(count($left)>0){
           $flag &= VerifySquenceOfBST($left);
        }
        if($flag&&count($right)>0){ 
            $flag &= VerifySquenceOfBST($right);
        }
        return $flag;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容