[剑指offer-1367]二叉搜索树的后序遍历序列

来源:互联网 发布:数据输入 编辑:程序博客网 时间:2024/06/06 14:15

题目描述:

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

输入:

每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。

输出:

对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。

样例输入:

7
5 7 6 9 11 10 8
4
7 4 6 5

样例输出:

Yes
No

代码实现

#include <stdio.h>#include <stdbool.h>#include <stdlib.h>bool vertifyBST(int sequence[] , int length){    if(sequence == NULL || length <=0)        return false;    int i =0; //左子树范围    int root = sequence[length-1];    for (; i < length-1; i++) {        if(sequence[i] > root)            break;    }    int j = i; //二叉搜索树种右子树节点大于根节点    for(;j < length-1;j++){        if(sequence[j] < root)            return false;    }    bool left = true; //验证左子树是否为BST    if(i>0)        left = vertifyBST(sequence, i);    bool right = true;    if(j<length-1)        right = vertifyBST(sequence+i, length-i-1);    return (left && right);}int main(int argc, const char * argv[]) {    // insert code here...    int n;    while (scanf("%d",&n) != EOF) {        int* sequence = (int*)malloc(n*sizeof(int));        for (int i=0; i<n; i++) {            scanf("%d",sequence+i);        }       bool result = vertifyBST(sequence, n);        if(result)            printf("Yes\n");        else            printf("No\n");    }    return 0;}
0 0
原创粉丝点击