二叉搜索树的后序遍历序列[剑指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))
    }
}
复制代码
相关文章
相关标签/搜索