建立二叉树并找第一条最长的路径长度,但程序最后只能输出最后插入的树的结点的值。求解原因是什么,怎么在原基础上修改,在此感激不尽

gy198902280318 2011-06-01 10:50:54
#include <iostream>
using namespace std;

#define MAXSIZE 20

typedef struct node
{
struct node *lchild;
struct node *rchild;
int data;
int count;
}node,*Bitree;

void init_tree(Bitree &t)
{
t=NULL;
}

//二叉树的建立
void insert(Bitree &t, const int &data)
{
if(!t)
{
t=(node *)malloc(sizeof(node));
t->data=data;
t->count=1;
t->lchild=NULL;
t->rchild=NULL;
}
else
{
if(t->data==data)
{ t->count++;return;}
if(data<t->data)
{
if(!t->lchild)
{
t->lchild=(node* )malloc(sizeof(node));
t->data=data;
t->count=1;
t->lchild=NULL;
t->rchild=NULL;
}
else insert(t->lchild,data);
}

else
{
if(!t->rchild)
{
t->rchild=(node*)malloc(sizeof(node));
t->data=data;
t->count=1;
t->lchild=NULL;
t->rchild=NULL;
}
else insert(t->rchild,data);
}

}
}
//求二叉树的第一条最长路径长度,并输出此路径上各结点的值
void LongestPath(Bitree &T,int (&longestpath)[MAXSIZE],int (¤tpath)[MAXSIZE],int& longest,int current)
{
if(!T)
{
if(current>longest)
for(int i=1;i<=current;++i)
{
longestpath[i]=currentpath[i];
longest=current;
}
}
else
{
currentpath[++current]=T->data;
if(T->lchild)
LongestPath(T->lchild,longestpath,currentpath,longest,current);
LongestPath(T->rchild,longestpath,currentpath,longest,current);
current--;
}
}
int main()
{
int longestpath[MAXSIZE];
int currentpath[MAXSIZE];
int longest=0;
static Bitree T;
init_tree(T);
insert(T,10);
insert(T,5);
insert(T,3);
insert(T,4);
insert(T,2);
insert(T,1);
insert(T,7);
insert(T,6);
insert(T,8);
insert(T,9);
insert(T,11);
insert(T,12);//只能输出此结点,之前插入的都白费了
LongestPath(T,longestpath,currentpath,longest,0);
for(int i=1;i<=longest;++i)
cout<<longestpath[i]<<' ';
return 0;
}
...全文
258 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gy198902280318 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nightelve 的回复:]
if(data<t->data)
{
if(!t->lchild)
{
t->lchild=(node* )malloc(sizeof(node));
t->lchild->data=data;
t->lchild->count=1;
t->lchild->lchild=NULL;
t->lchild->rchild=NULL;
}
else insert(t->lchild,……
[/Quote]
嗯,对,忘改成左子树了,但改完之后,在vc6.0上虽然编译无误,但还是运行不出来
gy198902280318 2011-06-02
  • 打赏
  • 举报
回复
错了,delete改成free
gy198902280318 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nightelve 的回复:]
对了,写程序的时候 有分配内存的话最好同时写上释放内存的代码

要不然容易漏写造成内存泄漏
[/Quote]

针对这个问题我又加了段代码:
void clear(Bitree t)
{
if(t)
{
clear(t->lchild);
clear(t->rchild);
delete t;
}
}
liruigui1990 2011-06-02
  • 打赏
  • 举报
回复
学习~~~~~~~~~~~~~~
nightelve 2011-06-02
  • 打赏
  • 举报
回复
对了,写程序的时候 有分配内存的话最好同时写上释放内存的代码

要不然容易漏写造成内存泄漏
nightelve 2011-06-02
  • 打赏
  • 举报
回复
if(data<t->data)
{
if(!t->lchild)
{
t->lchild=(node* )malloc(sizeof(node));
t->lchild->data=data;
t->lchild->count=1;
t->lchild->lchild=NULL;
t->lchild->rchild=NULL;
}
else insert(t->lchild,data);
}

else
{
if(!t->rchild)
{
t->rchild=(node*)malloc(sizeof(node));
t->rchild->data=data;
t->rchild->count=1;
t->rchild->lchild=NULL;
t->rchild->rchild=NULL;
}
else insert(t->rchild,data);
}
这边改成这样

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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