【劍指offer】33.二叉搜索樹的後序遍歷序列

33.二叉搜索樹的後序遍歷序列

面試題33. 二叉搜索樹的後序遍歷序列

難度中等39

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

參考以下這顆二叉搜索樹:

     5
    / \
   2   6
  / \
 1   3

示例 1:

輸入: [1,6,3,2,5]
輸出: false

示例 2:

輸入: [1,3,2,6,5]
輸出: true

1.遞歸-分治

時間複雜度:O(n^2) 每次調用 recur(i,j) 減去一個根節點,因此遞歸佔用 O(N) ;最差情況下(即當樹退化爲鏈表),每輪遞歸都需遍歷樹所有節點,佔用 O(N)

空間複雜度 O(N) : 最差情況下(即當樹退化爲鏈表),遞歸深度將達到 NN 。

   //遞歸 --分治
        //後序遍歷 左右根 特點左子樹節點的值均小於根節點  右子樹節點的值均大於根節點
        //由此可知 數組中最後一個元素就是跟節點。通過兩次for 找到第一個大於root.val的值
        //將數組劃分成 小於根節點的  和 大於根節點的 兩部分,通過遞歸調用 就可以逐一比較。
        public boolean verifyPostorder(int[] postorder) {
            if(postorder == null || postorder.length == 0){
                return true;
            }
            return verify(postorder,0,postorder.length-1);
        }
    
        public boolean verify(int [] postorder,int first,int last){
            if(last-first<=1){ //如果數組中只有一個元素 說明是有序的。
                return true;
            }
            int curIndex = first;
            int rootVal = postorder[last];//根節點
            //找到第一個大於根節點的值 下標
            while(curIndex < last && postorder[curIndex]<=rootVal ){
                curIndex++;
            }
    
            for(int i = curIndex;i<last;i++){
                //如果右子節點小於根節點 不是BST
                if(postorder[i]<rootVal){
                    return false;
                }
            }
            return verify(postorder,first,curIndex-1) && verify(postorder,curIndex,last-1);
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章