俊介三

一天更新一点,一天积累一点

导航

二叉搜索树的后序遍历序列

Posted on 2013-04-04 11:10  俊介三在前进  阅读(130)  评论(0)    收藏  举报

题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
http://ac.jobdu.com/problem.php?cid=1039&pid=9

 

思路:这个问题思路很简单,但思路简单不意味着轻易能全对。对我做递归题有更深的了解吧,所以贴进来了。
递归题的一般想法:1)看清结构,想办法分出递归子问题来;
2)考虑递归到最后会出现哪些情况,如本题,要么左树为空、要么右树为空、要么都不为空、要么只剩一个元素等等情况,把这些情况if else一下,即分段讨论
3)用笔画出图来,找出每种情况题中i和j的关系是怎样的(i和j即左右子树移动的指针);
4)递归求解,注意每层递归有几个递归子问题,就可以看成几叉树,画出来更容易理解。

代码:

#include <stdio.h>
#include <iostream>
using namespace std;

int arr[10005];
int n;

int isPost(int s, int e){
    if(s==e) return 1;
    int i=s;
    int j=e-1;
    while(arr[e]>arr[i]) i++;
    while(arr[e]<arr[j]) j--;
    int left = 1;
    int right = 1;
    if(j+1!=i) return 0;
    else{
        //left is empty
        if(i==e){
            right = isPost(s,e-1);
        }
        //right is empty
        else if(i==s){
            left = isPost(s,e-1);
        }
        else{
            left = isPost(s,j);
            right = isPost(i,e-1);
        }
    }
    if(left && right) return 1;
    else return 0;
}

int main(){
    int i;
    while(scanf("%d",&n)!=EOF){
        for(i=0;i<n;i++){
            scanf("%d",&arr[i]);
        }

        int ans = isPost(0,n-1);
        printf("%s\n",ans?"Yes":"No");
    }
    return 0;
}