二叉搜索树的后序遍历序列


title: 2019-8-20 二叉搜索树的后续遍历序列

tags: 算法,每日一题,二叉树


二叉搜索树的后序遍历序列

1. 题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

2. 题目解析

这道关键是要了解二叉搜索树的后序遍历的的特性。首先对于二叉搜索树有左子树上的元素都小于根节点,右子树上的元素都大于根节点。由于是后序遍历那么序列中最后一个元素一定是根节点。那么一定存在一个位置是左右子树的分界位置,这个位置的特点是左边的元素都比根节点小,右边的元素都比根节点大。这样实际上就把左右子树和根节点分离开了。这样再继续的递归下去看左右子树是否满足这个条件。如果都满足则说明该序列是二叉搜索树的后续遍历序列。

2.1 思路解析

使用递归实现
首先递归基是当开始位置大于等于结束位置时返回true,说明这个时候只有一个数了。
接下来就是查找左右子树分界位置对应的index了,这个很简单遍历一遍从beginend的序列,某个位置出现的元素比根大说明就是那个位置了。
然后再判断从indexend位置所有值是否都比根大,如果不是则返回false
如果是则继续递归比较左子树和右子树的情况,返回左子树和右子树的结果的与。

class Solution {
public:
    bool VerifySquenceOfBST(vector sequence) {
        if(sequence.empty()) return false;
        
        return verifyBST(0, sequence.size()-1, sequence);
    }
    
    bool verifyBST(int be, int end, vector& sequence){
        if(be >= end) return true; //这里必须是>=假定上一次是两个的情况,index=end,在右子树那边有index>end-1
        
        int root = sequence[end];
        //查找边界index,找到的index属于右子树
        int index = be;
        for(; index < end; ++index){
            if(root < sequence[index]){
                break;
            }
        }
        //验证右子树的元素都大于根节点
        for(int i=index; i < end; ++i){
            if(sequence[i] < root) return false;
        }
        
        return verifyBST(be, index-1, sequence) && verifyBST(index, end-1, sequence);
    }
};

更多关于编程和机器学习资料请关注FlyAI公众号。

你可能感兴趣的:(牛客剑指offer)