我是靠谱客的博主 光亮网络,最近开发中收集的这篇文章主要介绍剑指offer JZ28 二叉搜索树的后序遍历序列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

思路:
一、递归
二叉搜索树的左右子树都是二叉搜索树,因此可以利用递归,判断每个子树是不是二叉搜索树
利用一个辅助函数,实现递归
首先判断这个数组的根节点是否满足二叉搜索树的要求
然后可以拆成左右子树,再对左右子树进行同样的判断

class Solution {
public:
    bool help(vector<int>a,int l,int r){
        if(l>=r) return true;
        int i=r;
        while(i>l&&a[i-1]>a[r]) i--;
        for(int j=i-1;j>=l;j--){
            if(a[j]>a[r]) return false;
        }
        return help(a,l,i-1)&&help(a,i,r-1);
    }
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size()<1) return false;
        return help(sequence,0,sequence.size()-1);
    }
};

二、非递归
跟递归一样,同样是判断根节点是否满足要求(左子树的所有节点都小于根节点;右子树的所有节点都大于根节点)

代码如下:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int n=sequence.size();
        if(n==0) return false;
        int i=0;
        n-=1;
        while(n){
            while(sequence[i]<sequence[n]){//这部分是左子树
                i++;
            }
            while(sequence[i]>sequence[n]){//这部分是右子树
                i++;
            }
            if(i<n) return false;//左子树部分+右子树部分=数组长度-根节点
            i=0;
            n--;
        }
        return true;
    }
};

最后

以上就是光亮网络为你收集整理的剑指offer JZ28 二叉搜索树的后序遍历序列的全部内容,希望文章能够帮你解决剑指offer JZ28 二叉搜索树的后序遍历序列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部