已知先序中序求后序 C实现(分治法)

知识盲点:

对数组掌握不牢固 

int a[5] = {1,2,3,4,5};

int *b;

b = &a[1];

b[2] = 4;

此实现传递的是数组指针,上一篇中实现是传递 数组下标。

传递下标 : in[in_pos+i]  ==  pre[pre_pos];

传递指针 : in[i]  ==  *pre;

为什么能实现两者的 等价(对于右边递归而言   左边同样道理) 

in[I] = in[(in+i+1)+i]   // in+i+1是上一次地址

关键 就在于递归调用传递 指针, 对in赋值时候,使 i   和       in_pos+i 具有同样的 效果(即指向同样的位置);


实现: 

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

void to_post_tree(char* pre, char* in, int length)
{
	char ch;
	if (length == 0)
		return;
	ch = *pre;
	int i;
	for (i = 0; i < length; i++) {
		if (in[i] == *pre) {
			break;
		}
	}
	to_post_tree(pre+1, in, i);
	to_post_tree(pre + i + 1, in + i + 1, length - i - 1);
	printf("%c", ch);

}

int main()
{
	char pre[8] = {'G','D','A','F','E','M','H','Z'};
	char in[8] = {'A','D','E','F','G','H','M','Z'};
	to_post_tree(pre, in, 8);
	return 0;
}

另一种实现的 核心地方(注意对比):

 for (i = 0; i < n; i++) {  
        if (in[in_pos + i] == root)  //root等价于上面的 *pre;
            break;  
    }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值