判断给定数组是否是二叉树的前序或者后序遍历结果

判断给定数组是否是二叉树的前序思路如下,如果数组是前序遍历的结果,那么最后一个数,总是可以把这个数组完整的分作两段,前一段的数小于等于最后一个数,后一段的数大于等于最后一个数。然后继续递归判断分出来的两端子数组,他们也必须满足上述条件才行。

思路很简单,代码如下:

#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>


//判断num是不是后序遍历结果
int is_postorder(int* num, int len)
{
    int ret= 0;
    if (len <= 2) {
        return 1;
    }

    int separator_pos = 0;
    int i = 0;
    int sub_root_val = num[len - 1];
    while ((i <= len - 2) && (num[i] <= sub_root_val)) {
        i++;
    }
    separator_pos = i;
    while ((i <= len - 2) && (num[i] >= sub_root_val)) {
        i++;
    }


    if ((len - 1) != i) {
        return 0;
    }


    return is_postorder(num, separator_pos) 
        && is_postorder(num + separator_pos, len - separator_pos - 1);
}


//判断num是不是前序遍历结果
int is_preorder(int* num, int len)
{
    int ret= 0;
    if (len <= 2) {
        return 1;
    }


    int separator_pos = 0;
    int i = 1;
    int sub_root_val = num[0];
    while ((i <= len - 1) && (num[i] <= sub_root_val)) {
        i++;
    }
    separator_pos = i;
    while ((i <= len - 1) && (num[i] >= sub_root_val)) {
        i++;
    }


    if (len != i) {
        return 0;
    }


    return is_preorder(num + 1, separator_pos - 1) 
        && is_preorder(num + separator_pos, len - separator_pos);
}


int main(int argc, char * argv[])
{
    int num [] = {1,3,4,7,10,9,5};    
    //int num [] = {5,3,1,4,9,7,10};
    //int num [] = {3,1,4,2};    
    int ret1 = is_postorder(num, sizeof(num)/sizeof(int));
    int ret2 = is_preorder(num, sizeof(num)/sizeof(int));
    printf("\nnum array is %s postorder\n", ret1 ? "" : "not");
    printf("\nnum array is %s preorder\n", ret2 ? "" : "not");

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值