已知 中序 和 前序后序 任一 求另外一种C实现~

xiaoxiao2021-02-28  64

核心思想:分治法

1 已知先序、中序 求后序

pre_pos 、  in_pos  、   post_pos  分别表示前中后 索引(初始均为0) 

int post[MAX]; int in[MAX]; int pre[MAX];

void to_post_tree(int pre_pos, int in_pos, int post_pos, int n) { int root; if (n == 0) return; if (n == 1) { post[post_pos] = pre[pre_pos]; return; } root = pre[pre_pos]; post[post_pos + n - 1] = root;//每次把当前处理区域的最后一个元素放入 int i; for (i = 0; i < n; i++) { if (in[in_pos + i] == root) break; } int l_len, r_len; l_len = i; r_len = n - i - 1; to_post_tree(pre_pos + 1, in_pos, post_pos,l_len); to_post_tree(pre_pos + l_len+1, in_pos + l_len+1, post_pos + l_len, r_len); }

2 已知中序、后序求先序: // 注意处理端点  void to_pre_tree(int pre_pos, int in_pos, int post_pos, int n) { int root; int i; if (n == 0) return; if (n == 1) { pre[pre_pos] = post[post_pos]; return; } root = post[post_pos+n - 1]; pre[pre_pos] = root; for (i = 0; i < n; i++) { if (in[in_pos+i] == root) break; } int l_len, r_len; l_len = i;//左子树长度 r_len = n - l_len - 1;//右子树长度 to_pre_tree(pre_pos+1, in_pos, post_pos, l_len);//递归处理左子树 与右子树 to_pre_tree(pre_pos + l_len+1, in_pos + l_len + 1, post_pos + l_len, r_len); } 两种 方式  差别 仅在 对于 根 位置 处理上

转载请注明原文地址: https://www.6miu.com/read-46481.html

最新回复(0)