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


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

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


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

1. 题目描述

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

2. 题目解析

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

2.1 思路解析

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

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty()) return false;
        
        return verifyBST(0, sequence.size()-1, sequence);
    }
    
    bool verifyBST(int be, int end, vector<int>& 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公众号。

公众号二维码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值