《剑指offer》-二叉搜索树的后序遍历序列

题目描述

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

解法:1.二叉搜索树,左子树不能大于根节点的值,右子树不能小于根节点的值

          2.后续遍历,根节点在最后一位。所以先找出根节点,然后左右子树的分界点,最后再用递归即可解决问题。

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
		int len = sequence.size();  
        vector<int> left;
        vector<int> right;
        if(len == 0) return false;  //空的数组返回false
        int root;
        int i = 0;
        root = sequence[len-1];

        for(; i < len - 1; i++) {  //找到根节点处的左子树,所有值都小于根节点
            if(sequence[i] > root)
                break;  //此时指向了右子树处
        }
        int j = i; //此时j指向右子树这边
        for(; j < len - 1; j++) {  //右子树,所有值应该大于根节点,一旦不成立,返回false
            if(sequence[j] < root)
                return false;
        }
        //左子树继续递归调用
        bool l = true;
        if(left.size() > 0) {
        	for(int n = 0; n < j; i++) left[n] = sequence[n]; //左子树赋值
		    l = VerifySquenceOfBST(left);
        }
        //右子树继续递归调用
        bool r = true;
        if(right.size() > 0) {
            for(int m = j; i < len - 1; i++) right[m] = sequence[m]; //右子树赋值
            r = VerifySquenceOfBST(right);
        }
  
        return (l&&r);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值