请教一道上海交大数据结构考研编程题目!(我现在正在准备考研,请好心人帮忙看看)

iamblueman 2003-09-14 11:58:32
题目是:
从键盘上输入若干个数对,如(I1,W1),(I2,W3).....(Im,Wm);其中I1,I2,.....Im,
是本结点的层号。注意根结点的层号为1,其经各层上的结点的层号依次比上上层上的结点的层号大1。另外,W1W2....Wm是结点的前序(即先根次序)序列。这是用层号加上前序表示树的一种方法。请编写一段程序,存储这个树。为简单起见,设这棵树上的结点度数最大为3,结点的存储形式为:
data parent son1 son2 son3
...............................
:....:.....:......:......:.....:


我写了下面一段程序(我只考虑了data,son1,son2,son3域)

#define NULL 0
#include <iostream.h>

template <class Type>
class TreeNode{
public:
Type value;
TreeNode<Type> *son1,*son2,*son3,*parent;
TreeNode(Type value=0):value(_value),son1(NULL),son2(NULL),son3(NULL),parent(NULL){}
};

template <class Type>
class Node{
public:
int layer;
Type value;
};

template <class Type>
void CreatTree( TreeNode<Type> *T,int ptr_head,int ptr_tail,Node<Type> *_Array ){
int firstson_tail,secondson_tail;

if( ptr_head <= ptr_tail )
{
T=new TreeNode<Type> ( (_Array+ptr_head)->value );
if( ptr_head < ptr_tail )//正在处理的节点T不是叶子节点
{
/******计算第一棵子树在数组中的结束位置******/
int i=ptr_head+2;
while(i<=ptr_tail)
{
if( (_Array+i)->layer > (_Array+ptr_head+1)->layer ) i++;
else break;
}
firstson_tail=i-1;

/*****************创建第一棵子树************/
CreatTree(T->son1,ptr_head+1,firstson_tail,_Array);
/*******************************************/
if( firstson_tail < ptr_tail )//第二棵子树存在
{
/******计算第二棵子树在数组中的结束位置******/
int j=i+1;
while(j<=ptr_tail)
{
if( (_Array+j)->layer > (_Array+ptr_head+1)->layer ) j++;
else break;
}
secondson_tail=j-1;

/*****************创建第二棵子树************/
CreatTree(T->son2,firstson_tail+1,secondson_tail,_Array);
/*******************************************/

if( secondson_tail < ptr_tail )//第三棵子树存在
{
/*****************创建第三棵子树************/
CreatTree(T->son3,secondson_tail+1,ptr_tail,_Array);
/*******************************************/
}
}
}
}
}

void main(){
Node<char> Array[12];
Array[0].layer=1; Array[0].value='A';
Array[1].layer=2; Array[1].value='B';
Array[2].layer=3; Array[2].value='E';
Array[3].layer=4; Array[3].value='I';
Array[4].layer=4; Array[4].value='G';
Array[5].layer=4; Array[5].value='K';
Array[6].layer=3; Array[6].value='F';
Array[7].layer=4; Array[7].value='L';
Array[8].layer=2; Array[8].value='C';
Array[9].layer=3; Array[9].value='G';
Array[10].layer=2; Array[10].value='D';
Array[11].layer=3; Array[11].value='H';

TreeNode<char> *root;

CreatTree(root,0,11,Array);

}

我现在遇到的问题是:为什么程序在执行完了以后,root指针并非为根结点
比如:我在程序最後执行了cout<<root->value;
结果程序不能正常结束。
请高手帮我看看到底是怎么回事!感谢万分!
...全文
66 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankzch 2003-09-16
  • 打赏
  • 举报
回复
是不是又是传值与引用调用的问题?
主函数里把root指针传给子函数CreatTree中的T,但是T后来指向重新分配的一块内存,所以子函数的一切变化与主函数的root无关了,root仍然没有被赋值
改为引用调用&应该没问题了吧
ZhangYv 2003-09-16
  • 打赏
  • 举报
回复
ft...我刚才看不到下面的程序。CSDN有时候怪怪的。UP........
我在网吧上网,没有时间调试。MD,上次网要走20分钟的路,垃圾学校的网络慢得连QQ都上不去。
ZhangYv 2003-09-16
  • 打赏
  • 举报
回复
题意不明,(I1,W1) (Im,Wm)具体各为何物? 是(Ii,Wj)吧?
题目的要求为什么,创建树?
iamblueman 2003-09-16
  • 打赏
  • 举报
回复
谢谢各位高手指点!
heartup 2003-09-16
  • 打赏
  • 举报
回复
你错误的原因很简单:
参数T应该用引用传递!

heartup 2003-09-16
  • 打赏
  • 举报
回复
自己先来写一个:
typedef struct TNode {
int data;
TNode* child[3];
} TNode;

TNode * createTree(int i[], int w[], int h, int t) {
/*初始调用为createTree(i, w, 0, t)*/
if(h>t) return 0;
pRoot = (TNode*)malloc~;
*pRoot = { w[h],{0,0,0} };
rootLevel = i[h]; k = 0; /*k标志第几各子树*/
h++;
for(j = h+2; j<=t; j++)
if(i[j]==rootLevel+1) {
pRoot->child[k++] = createTree(i, w, h, j-1);
h = j;
}
pRoot->child[k] = createTree(i, w, h, t); /*最后一个子树*/

return pRoot;
}

limd 2003-09-16
  • 打赏
  • 举报
回复
嗯,的确,root指针传给函数CreatTree是进行的的值传递,这样吧,把函数的参数改为这样的:
void CreatTree( TreeNode<Type>* &T,int ptr_head,int ptr_tail,Node<Type> *_Array );
没有调试,不知道有没有错误了,自己顶着吧

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧