力扣 面试题33. 二叉搜索树的后序遍历序列 dfs+分治

62 篇文章 0 订阅
11 篇文章 0 订阅

https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/submissions/
在这里插入图片描述

思路:假设某棵二叉搜索树的根节点的值为 v v v,由二叉搜索树的性质易得:左子树的任意一个节点的值均小于 v v v,右子树的任意一个节点的值均大于 v v v,已知当前二叉搜索树的后序遍历 p o s t o r d e r [ i … j ] postorder[i…j] postorder[ij],那么显然此时根节点就是 p o s t o r d e r [ j ] postorder[j] postorder[j],通过上述性质我们可以得到一个分界点 d i v div div满足 p o s t o r d e r [ i … d i v − 1 ] < v , p o s t o r d e r [ d i v … j − 1 ] > v postorder[i…div-1]<v,postorder[div…j-1]>v postorder[idiv1]<vpostorder[divj1]>v,所以左子树的区间限定到 [ i , d i v − 1 ] [i,div-1] [i,div1],右子树的区间限定到 [ d i v , j − 1 ] [div,j-1] [div,j1],那么不难写出递归的解法。

class Solution {
public:
    bool dfs(int i,int j,vector<int>& postorder)
    {
        if(i>=j)
            return 1;
        int pos=i;                         //左子树理应均小于根节点的值
        while(postorder[pos]<postorder[j])//找到第一个值大于根节点的位置
            ++pos;
        int div=pos;//记录一下划分位置
        while(postorder[pos]>postorder[j])//右子树理应均大于根节点的值
            ++pos;
        if(pos==j&&dfs(i,div-1,postorder))//左子树满足题意
            return dfs(div,j-1,postorder);//右子树
        return 0;
    }

    bool verifyPostorder(vector<int>& postorder) {
        return dfs(0,postorder.size()-1,postorder);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值