每日一题:二叉搜索树的后序遍历(C++)

**题目描述:**输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:

 5
/ \

2 6
/
1 3
示例 1

输入: [1,6,3,2,5]
输出: false
示例 2

输入: [1,3,2,6,5]
输出: true

**已知条件:**后序序列最后一个值为 root,二叉搜索树的左子树的值都小于root,右子树的值都大于root。

解题思路:

  1. 确定根节点root,数组的最后一个元素。
  2. 遍历序列(除了root),找到第一个大于root的位置,该位置左边为左子树的所有元素,右边为右子树的所有元素。
  3. 遍历右子树,若发现有小于root的值,返回false。
  4. 分别判断左子树和右子树是否是二叉搜索树(即递归1 2 3)。
class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {
        bool res = true;
        if(postorder.empty()){
            return res;
        }

        res = IsTrue(postorder, 0, postorder.size() - 1);

        return res;
    }

    bool IsTrue(vector<int> postorder, int start, int end){
        if(postorder.empty() || start > end){
            return false;
        }

        // 根节点
        int root = postorder[end];

        int i = start;

        // 找到根节点的左子树 i-1
        for(i; i < end; ++i){
            if(postorder[i] > root){
                break;
            }
        }

        // 根节点的右子树大于根节点
        for(int j = i; j < end; ++j){
            if(postorder[j] < root){
                return false;
            }
        }

        // 判断左子树是不是二叉搜索树
        bool left = true;
        if(i > start)  {
            left  = IsTrue(postorder, start, i - 1);
        }

        // 判断右子树是不是二叉搜索树
        bool right = true;
        if(i < end){
            right = IsTrue(postorder, i, end - 1);
        }
        return left && right;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值