24-判定给定数组是否为二叉搜索(排序)树的后序遍历序列

一、题目描述

输入一个整数数组,判断数组是不是某二叉搜索树的后续遍历结果,如果是则返回true,不是则返回false.假设输入的数组的任意两个数字并不相同

二、问题分析

二叉搜索(排序)树的特点是:左子树结点值 < 根节点值 < 右子树结点值根据后序遍历(左右根),结合数组可知道:数组最后一个元素一定是二叉树的根结点

所以解题的算法思路如下:
1)取数组最后一个元素作为根节点,其余元素可分为两部分
2)遍历此数组(不包括根结点值的遍历)元素,找左子树结点的子数组:它们都比当前根节点的值小
3)找右子树结点的值:它们都比当前根节点的值大

以此类推,最后完成递归

三、算法实现

/************************************************
author:tmw
date:2018-7-1
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool array_is_BST( int* array, int array_len )
{
    /**入参校验**/
    if( !array || array_len <= 0 ) return false;

    /**获取当前根节点值**/
    int root = array[array_len-1];

    int i,j;

    /**找左子树--注意要去掉根节点**/
    for( i=0; i<array_len-1; i++ )
        if( array[i] > root )
            break;

    /**找右子树--注意要去掉根节点**/
    for( j=i; i<array_len-1; j++ )
        if( array[j] < root ) //BST非根节点右子树的值不可能小于根节点的值
             return false;   //如果有,说明此序列不满足BST的后序遍历,直接return

    /**递归分别找左、右子树是否满足BST后序遍历规则**/
    bool left_nodes = true;
    if( i > 0 ) //有左芬志结点--才递归
        left_nodes = array_is_BST( array, i );

    bool right_nodes = true;
    if( j < array_len-1 ) //有右分支结点--才递归
        right_nodes = array_is_BST( array+i, array_len-i-1 );

    return left_nodes && right_nodes;
}

梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值