面试训练排序二叉树



思路呢 就是利用后序遍历的性质吧

1 数组最后一个元素为根元素,左边都为 左子树和右子树节点。

2 根据数组的根结点以及搜索二叉树的性质,左边小 右边大 ,那么遍历左边的数组元素 找到第一个大于该元素的节点为右子树的节点

3 此时可以用递归解决问题咯

比如上题的过程如下 

{5,7,6,9,11,10,8}

根节点 8

遍历 找到 9 为右子树的第一个节点

那么 可以 5 7 6为左子树 6 为左子树根结点  9 10 11 为右子树 其中11为右子树根结点

依次这么递归下去。

如何返回呢~我们知道后序遍历的性质吧,先左子树 后右子树 然后根,保证左子树的节点都小于,保证右子树的节点都大于根。那么依次这么细分 知道只剩下一个元素

代码如下

#include "stdio.h"
int judgeSortTree(int *data,int start,int last)
{
	int ret =0;
	int index=0;
	int i =0;
	if(start >=last)
	{
		ret=1;
		return ret;
	}

	for(index=start;index<last;index++)
	{
		if(data[index]>data[last])
			break;
	}
	for(i=start;i<index;i++)  /*当然左子树检测这一步可以省去,因为如果左子树中有元素大于根元素,其毕被分到右子树中,因此不需要判断也可以。*/
	{
		if(data[i]>data[last])
		{
			return 0;
		}
	}
	/*右子树必须大于根*/
	for(i=index;i<last;i++)
	{
		if(data[i]<data[last])
		{
			return 0;
		}
	}
	return judgeSortTree(data,start,index-1)&&judgeSortTree(data,index,last-1);
}

int main()
{
int data[]={5,7,6,9,11,10,8}; /*yes*/
	//	int data[] ={7,4,6,5};     /*No*/
	int ret =0;
	int len= sizeof(data)/sizeof(data[0]);
	ret = judgeSortTree(data,0,len-1);
	if(ret ==1)
	{
		printf("OK\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值