俊介三

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

导航

判断整数序列是不是二元查找树的后序遍历结果

Posted on 2013-03-28 13:06  俊介三在前进  阅读(158)  评论(0)    收藏  举报

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

       8
      /  \
     6    10
    / \    / \
   5  7   9  11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

思路:后序遍历意味着数组最后一个元素一定是根。再根据binary search tree的特点,左子树一定比根小,右子树一定比根大来递归地检查左右子树。

代码:

#include <stdio.h>

bool ispostorder(int* arr, int start, int end){
    if(start>=end) return true;
    
    int i = start;
    while(i<end){
        if(arr[i]>=arr[end]) break;
        i++;
    }
    bool l = (i==start)?true:ispostorder(arr,start,i-1);
    bool r = (i==end)?true:ispostorder(arr,i,end-1);
    if(l&&r){
        int j;
        for(j=start;j<i;j++){
            if(arr[j]>=arr[end]) return false;
        }
        for(j=i;j<end;j++){
            if(arr[j]<=arr[end]) return false;
        }
        return true;
    }else{
        return false;
    }
}

//更工整的方法。
int isPostorder(int* arr, int start, int end){
    if(start>=end) return 1;
    int i =end-1;
    while(i>=start && arr[end]<arr[i]) i--;
    if(!isPostorder(arr,i+1,end-1)) return 0;
    int j=start;
    while(j<=i && arr[j]<arr[end]) j++;
    if(j!=i+1) return 0;
    return isPostorder(arr,start,j-1);
}

int main(){
    int arr[]={5,7,6,9,11,10,8};
    printf("%s\n",ispostorder(arr,0,6)?"Yes":"No");
    printf("%s\n",isPostorder(arr,0,6)?"Yes":"No");
    return 0;
}