运行程序后就停止运行了,看了五六遍了,还是找不出。BuildTree函数错了
C语言二叉树已知前序遍历和中序遍历求后序遍历。只有70行代码,求找错。
答案:2 悬赏:0
解决时间 2021-02-18 09:37
- 提问者网友:说不出醉人情话
- 2021-02-18 01:29
最佳答案
- 二级知识专家网友:风格单纯
- 2021-02-18 01:45
无需建立二叉树:
1. 获取当前前序序列的第一个元素并输出(按层次遍历)
2. 从对应的中序序列中找到该元素,该元素此时将二分中序序列中的元素
3. 依据划分出的两个序列,在前序序列中找到这两个序列(按照中序中序列的元素个数即可划分)
4. 对划分后的先序序列继续1, 2,3两步(要平行进行不能处理完一个序列再处理另一个序列)直到遍历全部元素,此时得到的序列即为层次遍历序列。
例如: 先序abdecfg, 中序dbeafcg
按照算法:
1. 输出先序第一个元素a
2. 依据a得到中序划分后的两个序列dbe,fcg,因此此时序列第一个子序列的长度为3
3. 由于划分后的左序列长度为3,先序中除a以外剩下的元素被划分为bde、cfg
4. 对先序序列bde和cfg重复上面的步骤,先输出两个序列的先序第一个元素b、c
5, 从中序序列dbe,fcg得到划分的子序列d、e和f、g,左序列的长度都为1
6. 因此前序序列被划分为了d、e和f、g四个序列,接着输出d、e、f、g
因此遍历的序列为abcdefg
1. 获取当前前序序列的第一个元素并输出(按层次遍历)
2. 从对应的中序序列中找到该元素,该元素此时将二分中序序列中的元素
3. 依据划分出的两个序列,在前序序列中找到这两个序列(按照中序中序列的元素个数即可划分)
4. 对划分后的先序序列继续1, 2,3两步(要平行进行不能处理完一个序列再处理另一个序列)直到遍历全部元素,此时得到的序列即为层次遍历序列。
例如: 先序abdecfg, 中序dbeafcg
按照算法:
1. 输出先序第一个元素a
2. 依据a得到中序划分后的两个序列dbe,fcg,因此此时序列第一个子序列的长度为3
3. 由于划分后的左序列长度为3,先序中除a以外剩下的元素被划分为bde、cfg
4. 对先序序列bde和cfg重复上面的步骤,先输出两个序列的先序第一个元素b、c
5, 从中序序列dbe,fcg得到划分的子序列d、e和f、g,左序列的长度都为1
6. 因此前序序列被划分为了d、e和f、g四个序列,接着输出d、e、f、g
因此遍历的序列为abcdefg
全部回答
- 1楼网友:猎杀温柔
- 2021-02-18 02:09
typedef struct Node {
char a;
struct Node *lchild;
struct Node *rchild;
}BiNode, *BiTree;
void PosTraverse(BiTree T) {
if (T == NULL) return;
PosTraverse(T->lchild);
PosTraverse(T->rchild);
printf("%c", T->a);
}
void BuildTree(char *pre, char* mid, BiTree root) {
int len = strlen(pre);
if (0 == len) return;
char *p = strchr(mid, pre[0]);
int pos = p - mid;
root->a = pre[0];
root->lchild = root->rchild = NULL;
if (pos != 0) {
e5a48de588b67a686964616f31333337373665BiTree left;
root->lchild = (BiTree)malloc(sizeof(BiNode));
left = root->lchild;
char *left_pre = (char*)malloc(sizeof(char) * (pos + 1));
char *left_mid = (char*)malloc(sizeof(char) * (pos + 1));
strncpy(left_pre, pre + 1, pos);
strncpy(left_mid, mid, pos);
left_pre[pos] = 0;
left_mid[pos] = 0;
BuildTree(left_pre, left_mid, left);
}
if (pos != len - 1) {
BiTree right;
root->rchild = (BiTree)malloc(sizeof(BiNode));
right = root->rchild;
char *right_pre = (char*)malloc(sizeof(char) * (len - pos));
char *right_mid = (char*)malloc(sizeof(char) * (len - pos));
strncpy(right_pre, pre + 1 + pos, len - pos - 1);
strncpy(right_mid, mid + 1 + pos, len - pos - 1);
right_pre[len - pos - 1] = 0;
right_mid[len - pos - 1] = 0;
BuildTree(right_pre, right_mid, right);
}
}
int main() {
BiNode temp;
BuildTree("abcdefg", "cbdafge", &temp);
PosTraverse(&temp);
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯