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

给定一个整数数组,该文介绍如何判断此数组是否符合二元查找树的后序遍历。通过获取并检查对应的中序序列是否有序来实现判断,提供了一种非递归解法。示例中,数组5, 7, 6, 9, 11, 10, 8是某二元查找树的后序遍历结果,而7, 4, 6, 5则不是。" 89707976,8474921,Java String详解:不可变性与常用方法,"['Java', '字符串处理', '数据比较', '内存管理']
摘要由CSDN通过智能技术生成

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果.

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


本题网上已经有用递归单纯判断的解法. 

个人解法: 先得到序列对应的中序序列, 然后看中序序列是否从小到大有序, 得出判断. 

想比:         时间复杂度相同, 增加N的空间, 但可求得对应的中序序列.


以下为代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN 100

int seq[LEN + 1] = {0};
int *mid = NULL;
int pos = 1;

void getmid(int start, int end);
int check(int num);

int main()
{
	int val;
	int num;
	int ret;
	int i;

	printf("input the sequence, end it with '-9999': ");
	
	num = 1;
	scanf("%d", &val);
	while(val != -9999)
	{
		seq[num] = val;
		num ++;
		scanf("%d", &val);
	}
	num--;

	mid = (int *)malloc((num + 1) * sizeof(int));
	if(mid == NULL)
	{
		printf("malloc failed.\n");
		exit(1);
	}
	memset(mid, 0, num + 1);

	getmid(1, num);
	
	printf("mid: ");
	for(i = 1; i< num +1; i++)
	{
		printf("%d ", mid[i]);
	}
	printf("\n");

	ret = check(num);

	if(ret == -1)
	{
		printf("no.\n");
	}
	else
	{
		printf("yes\n");
	}

	return 0;
}/* main() */

void getmid(int start, int end)
{
	int flag;

	if(start > end)
	{
		return;
	}

	if(start == end)
	{
		mid[pos] = seq[end];
		pos ++;
		return;
	}

	int par;
	par = start;
	flag = 0;
	while(par < end)
	{
		if(seq[par] > seq[end])
		{
			flag = 1;
			getmid(start, par - 1);
			mid[pos] = seq[end];
			pos ++;			
			getmid(par, end - 1);
			break;
		}
		par ++;
	}

	if(!flag)
	{
		getmid(start, end-1);
		mid[pos] = seq[end];
		pos ++;
	}


}/* getmid */

int check(int num)
{
	int i;
	
	for(i = 1; i < num; i++)
	{
		if(mid[i] > mid[i+1])
		{
			return -1;
		}
	}

	return 0;
}/* check() */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值