二叉搜索樹的後序遍歷序列[劍指offer]

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

假設給定的序列是[4,6,7,5],根據二叉搜索樹的性質以及後序遍歷的規律,咱們不可貴出下面這樣的樹:java

  • 二叉搜索的左孩子都小於父節點,二叉搜索樹的右孩子都大於父節點
  • 後序遍歷的順序是左-->右-->根
5
   / \
  4   7
     /
     6
複製代碼

根據上面的思路,咱們能夠得出這樣的思路:數組

  • 數組最後一個元素是根節點(後序遍歷)
  • 由二叉搜索樹的性質,左子樹全部的節點都小於根節點.
  • 後序遍歷老是先遍歷完左子樹,再遍歷右子樹,因此左右子樹的邊界是第一個大於根節點的元素。

咱們再來看一個複雜點的例子[4,8,6,12,16,14,10]
這裏先給出樹結構。bash

10
                    /   \
                   6     14
                  / \   /  \
                 4   8  12  16
複製代碼

根據上面的分析,咱們很容易知道[4,6,8]是左子樹,[12,16,14]是右子樹。函數

root = 10
left = [4,8,6]
right = [12,16,14]
// 由於二叉搜索樹的子樹一樣是一顆二叉搜索樹,因此咱們重複上述步驟
**************
對於左子樹來講
root = 6
left = [4]  //只有一個元素說明到達葉子結點
right = [8]
**************
對於右子樹來講
root = [14]
left = [12]
right = [16]
**************
咱們發現,根據序列生成的樹符合二叉搜索樹的定義,因此結果爲true
複製代碼

這些都是符合條件的遍歷結果,那不符合條件的呢?spa

咱們將上面的例子稍微修改一下,假設給定的序列是:[4,12,8,6,16,14,10]code

root = 10;
left = [4]
right = [12,8,16,14]
**********
對於左子樹來講,很容易判斷是知足二叉搜索樹的。

對於右子樹
right = [12,8,16,14]中有一個元素小於 root(10),不符合條件,所以這不是一棵二叉搜索樹,直接返回false.


假設right = [12,20,18,11] 所有都大於root(10),但它並非一顆二叉搜索樹
                11
                /
              18
              /\
             12 20
所以咱們須要進行遞歸判斷.
複製代碼

經過上面的分析,咱們也能夠知道,咱們只須要判斷右子樹是否是一棵二叉搜索樹就能夠了。遞歸

因而咱們很輕鬆就寫出下面的函數ip

function VerifySquenceOfBST(sequence) {
    if(!sequence.length){ 
        return false                  
    }                                
    let root = sequence.pop() //5
    let start = sequence.findIndex((val)=>{
            return val>root   
    })
    return start===-1?true:isBST(root,sequence.slice(start))
    function isBST(root,tree){ //root 5 tree[1,2,3,4]
        if(!tree.length){ // 若是數組數爲空,則返回true
            return true
        }
        let index = tree.findIndex((val)=>{ //index === -1
            return val<root
        })
        if(index != -1){
            return false
        }
        root = tree.pop() //root 7 tree[6]
        let start = tree.findIndex((val)=>{
            return val>root //
        })
        return tree.length===1?true:isBST(root,tree.slice(start))
    }
}
複製代碼
相關文章
相關標籤/搜索