二叉树的后序遍历序列

目录

题目描述

思路

正文

分治 

代码


题目描述

思路

说实话,我第一眼看到这个题目,一点思路都没有,除了知道二叉树后序遍历遵循"左右根"的遍历方式以外其他的什么都不知道,两眼一抹黑....

后来看了题解又摸索着自己写,写来写去,都有问题,emmm,看别人写的十分简洁,自己写的一堆废话.实在是让我汗颜........

后来不得已去看了K神的题解.

K神,YYDS

正文

思想就是分治递归,我们寻找第一个大于最后一个元素的节点,保存这个位置的index,然后移动当前下标直到到达right,凭借postorder[right]将数组分为两部分,[left,index-1],[index,right-1]  (注:这里的右子树一定是index,而不是index+1).再对这两部分进行递归判断,结果相与&&,最后还要判断游标是否到达right,因为index右边的元素(除了下标为right的元素)应该都是大于下标为right的元素,因为二叉搜索树的性质. 一直递归下去,知道left>=right,直接返回true

分治 

大问题换成小问题, 我们求一个长序列,转化为求两个小区间序列是否满足条件.这和递归的大势化小的思想是相似的,

代码


class Solution {
public:
    bool judge(vector<int>& postorder, int left, int right)         //左闭右闭区间
    {
        int temp=left;
        int index;
        if (left >= right) return true;
        while (postorder[temp] < postorder[right]) ++temp;
        index = temp;
        while (postorder[temp] > postorder[right])  ++temp;
        return temp==right&&judge(postorder, left, index - 1) && judge(postorder, index, right-1);
    }

    bool verifyPostorder(vector<int>& postorder) {
        return judge(postorder,0, postorder.size() - 1);
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shallow_Carl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值