NOWCODER【编程题】——二叉树的后序遍历序列

题目描述

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

解题思路

首先我们需要知道二叉树后序遍历序列的特点:最后一个节点为根节点,去掉根节点的话,可以把s列分为两部分,左边那部分所有节点值都比根节点小,右边那部分都比根节点大。下面看怎么解决这个题:

  1. 首先判断这棵树是否为空树,如果为空树的话,返回false;
  2. 不为空就重新写一个函数判断这棵树是否为二叉搜索树的后序遍历;
  3. 如果这个二叉树只有一个节点,那么肯定满足二叉排序树的性质,return true;否则就把这个序列划分成两部分,进行递归判断。

具体实现看代码和注释。

实现代码

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int sz=sequence.size();
        if(sz==0)//二叉树为空树
            return false;
        else 
            return isLastOrder(sequence,0,sz-1);
    }
    bool isLastOrder(vector<int>&arr,int left,int right)
    {
        if(left==right)//一个节点的情况
            return true;
        int mid=left;
        while(arr[mid++]<arr[right] && mid<right);
        int temp=mid;//第一个右子树的节点
        while(arr[temp++]>arr[right] && temp<right);
        if(temp<right)//说明右边序列有比最后一个元素小的值,不满足后序遍历后续
            return false;
        if(mid==left || mid == right)//说明这个数只有左子树或者右子树
            return isLastOrder(arr,left,right-1);
        else
            return (isLastOrder(arr,left,mid-1)&&isLastOrder(arr,mid,right-1));
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值