一、题目描述
输入一个整数数组,判断数组是不是某二叉搜索树的后续遍历结果,如果是则返回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;
}
梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~