一道数据结构的考研题目

时间:2021-12-24 10:27:49
给出一个树的中序遍历和层次遍历的顺序表,让你生成这个树

要求用C来实现,写算法就可以了

后天就考试了,明天结贴!

12 个解决方案

#1


是让你生成树, 不是让我们生成树!!

#2


楼上说得对~~~

#3


同意,其实好多资料里都有你要得算法

#4


我最烦你们这些作业题了,一点技术含量都没有!

这样问题都不能解决的话,小弟还是省下读研的时间,参加工作多积累点经验值吧。 忠告。

#5


我最烦你们这些作业题了,一点技术含量都没有!

#6


靠!这算什么?
大家交流一下思路嘛!
我又不是没有想过:

把层次遍历次序做成一个栈,每次从栈里读出一个次序数,对中序遍历的次序表进行折半。
然后再读另一个层次遍历次序数,先对折半后的左子树中序进行查找,如果能找到这个次序数的话就再次递归以上函数;如果找不到则找折半后的右子树。

只是我觉得自己的思路做实现起来太麻烦了,想问一下大家的意见,看你们那一大堆说的什么东西。
//***************************
真是一点儿都不懂的话还考个屁研啊!只是想跟大家交流一下而已,CSDN是干什么的?
有规定说作业题不能拿上来问吗?
作业题自己不做就拿上来那是对自己不负责任;看到问题不加考证乱加帽子就是对他人不负责任!
//*******************************************
最后我想指出一下,我不觉得这个题很简单
我不是一点儿工作经验也没有,也做过些程序,
说真的,小弟也劝某些朋友一句,做一个没有思想的程序员就算工作二十年,也只是一个“高级钳工”,考研充充电吧。忠告。
//*********************************

说够了!

希望后面看到这个贴子的大哥能本着交流的态度把自己的想法拿出来分享一下
谢谢!

#7


没什么,不给我书我也出不来!

#8


好像是清华的那本数据结构的联系题
楼主可以参考一下

#9


没这么测试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _node {
char c;
struct _node *lchild, *rchild;
}NODE;
char a[] = "GDHBAEICJF";
char b[] = "ABCDEFGHIJ";
NODE *root = NULL;

void work(NODE **proot, char *as, char *ae, char *bs, char *be)
{
char *p, *q;
for (q=bs; q<=be; q++)
for (p=as; p<=ae; p++)
if (*p == *q)
goto NEXT;
return;
NEXT:
*proot = (NODE *)malloc(sizeof(NODE));
memset(*proot, 0, sizeof(NODE));
(*proot)->c = *q;
work(&((*proot)->lchild), as, p-1, q+1, be);
work(&((*proot)->rchild), p+1, ae, q+1, be);
}

void print(NODE *p)
{
if (p!=NULL)
{
printf("%c", p->c);
print(p->lchild);
print(p->rchild);
}
}

int main(int argc, char* argv[])
{
work(&root, a, a+10, b, b+10);
print(root);
printf("\n");
return 0;
}

#10


啊唷!小兄弟上火了,不要这么容易激动么, ^^
既然是抱着交流的态度来的,那么我也认真的对待你的问题(其实你要是早点写出你自己的思路,抱着“交流”的态度来让人给看看,别人也不会认为你将问题想都没想就拿上来等答案,是吧?)
我的思路是这样的:
层次遍历的第一个元素一定是整个树的根,得到这个根,用这个根可以将中序遍历序列分为左、根、右三部分。对左子树,它的根是所有左子树元素中在层次遍历序列中最先出现的那个,这样就可以找到左子树的根,然后递归使用此方法,就能找到所有的根,所有的根都找到了,二叉树的结构就定了,写个程序应该不难。
不知这个方案符合不符合你的要求,我没写程序,也许还可能有错误(我自己只画了两个图验证了一下),请楼下的朋友指教。
继续关注中。

#11


同意楼上的
关键是函数形参的设计

#12


谢谢各位,尤其要谢谢QuickKeyBoard() ,
首先我要对自己的话道歉~~~当时也的确有些太过激动了,在此对自己的话表示歉意。

今天已经考完了,实践证明我真的是很菜,平是尽说大话了,太过自信~~

哎!不说了,再次感谢各位!

马上散分!

#1


是让你生成树, 不是让我们生成树!!

#2


楼上说得对~~~

#3


同意,其实好多资料里都有你要得算法

#4


我最烦你们这些作业题了,一点技术含量都没有!

这样问题都不能解决的话,小弟还是省下读研的时间,参加工作多积累点经验值吧。 忠告。

#5


我最烦你们这些作业题了,一点技术含量都没有!

#6


靠!这算什么?
大家交流一下思路嘛!
我又不是没有想过:

把层次遍历次序做成一个栈,每次从栈里读出一个次序数,对中序遍历的次序表进行折半。
然后再读另一个层次遍历次序数,先对折半后的左子树中序进行查找,如果能找到这个次序数的话就再次递归以上函数;如果找不到则找折半后的右子树。

只是我觉得自己的思路做实现起来太麻烦了,想问一下大家的意见,看你们那一大堆说的什么东西。
//***************************
真是一点儿都不懂的话还考个屁研啊!只是想跟大家交流一下而已,CSDN是干什么的?
有规定说作业题不能拿上来问吗?
作业题自己不做就拿上来那是对自己不负责任;看到问题不加考证乱加帽子就是对他人不负责任!
//*******************************************
最后我想指出一下,我不觉得这个题很简单
我不是一点儿工作经验也没有,也做过些程序,
说真的,小弟也劝某些朋友一句,做一个没有思想的程序员就算工作二十年,也只是一个“高级钳工”,考研充充电吧。忠告。
//*********************************

说够了!

希望后面看到这个贴子的大哥能本着交流的态度把自己的想法拿出来分享一下
谢谢!

#7


没什么,不给我书我也出不来!

#8


好像是清华的那本数据结构的联系题
楼主可以参考一下

#9


没这么测试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _node {
char c;
struct _node *lchild, *rchild;
}NODE;
char a[] = "GDHBAEICJF";
char b[] = "ABCDEFGHIJ";
NODE *root = NULL;

void work(NODE **proot, char *as, char *ae, char *bs, char *be)
{
char *p, *q;
for (q=bs; q<=be; q++)
for (p=as; p<=ae; p++)
if (*p == *q)
goto NEXT;
return;
NEXT:
*proot = (NODE *)malloc(sizeof(NODE));
memset(*proot, 0, sizeof(NODE));
(*proot)->c = *q;
work(&((*proot)->lchild), as, p-1, q+1, be);
work(&((*proot)->rchild), p+1, ae, q+1, be);
}

void print(NODE *p)
{
if (p!=NULL)
{
printf("%c", p->c);
print(p->lchild);
print(p->rchild);
}
}

int main(int argc, char* argv[])
{
work(&root, a, a+10, b, b+10);
print(root);
printf("\n");
return 0;
}

#10


啊唷!小兄弟上火了,不要这么容易激动么, ^^
既然是抱着交流的态度来的,那么我也认真的对待你的问题(其实你要是早点写出你自己的思路,抱着“交流”的态度来让人给看看,别人也不会认为你将问题想都没想就拿上来等答案,是吧?)
我的思路是这样的:
层次遍历的第一个元素一定是整个树的根,得到这个根,用这个根可以将中序遍历序列分为左、根、右三部分。对左子树,它的根是所有左子树元素中在层次遍历序列中最先出现的那个,这样就可以找到左子树的根,然后递归使用此方法,就能找到所有的根,所有的根都找到了,二叉树的结构就定了,写个程序应该不难。
不知这个方案符合不符合你的要求,我没写程序,也许还可能有错误(我自己只画了两个图验证了一下),请楼下的朋友指教。
继续关注中。

#11


同意楼上的
关键是函数形参的设计

#12


谢谢各位,尤其要谢谢QuickKeyBoard() ,
首先我要对自己的话道歉~~~当时也的确有些太过激动了,在此对自己的话表示歉意。

今天已经考完了,实践证明我真的是很菜,平是尽说大话了,太过自信~~

哎!不说了,再次感谢各位!

马上散分!