知识盲点:
对数组掌握不牢固
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; }