写了一个二叉树的c++程序,请大家看看有没有什么问题

落入凡间的猪 2003-02-11 09:57:59
struct BTREE
{
int nValue;
BTREE* Bleft;
BTREE* Bright;
};

void InsertNode(int value, BTREE* &bTree)
{

BTREE* pnewTree = new BTREE;
pnewTree->nValue = value;
pnewTree->Bleft = NULL;
pnewTree->Bright = NULL;

if ( bTree == NULL)
{
bTree = pnewTree;
}
else
{
if (value > bTree->nValue)
{
InsertNode(value,bTree->Bright);
}
else
{
InsertNode(value,bTree->Bleft);
}

}

}

void InOrder(BTREE* bTree)
{
if (bTree != NULL)
{
printf("%d ",bTree->nValue);
InOrder(bTree->Bleft);
InOrder(bTree->Bright);
}
}

int main(int argc, char* argv[])
{
//printf("Hello World!\n");
BTREE* m_tree = NULL;

InsertNode(10, m_tree);
InsertNode(20,m_tree);
InsertNode(5,m_tree);
InsertNode(3,m_tree);
InsertNode(30,m_tree);

InOrder(m_tree);
return 0;
}
...全文
40 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
落入凡间的猪 2003-02-12
  • 打赏
  • 举报
回复
不同样 为 “不同意”
落入凡间的猪 2003-02-12
  • 打赏
  • 举报
回复
你的第一条很对
第二条我现在改成了template了

第三条我不同样,呵呵,
我接受了 windcsn(各位新年洋洋得意),Iong(有来有分)还有你的指正

anyway ,thanks
robin97 2003-02-12
  • 打赏
  • 举报
回复
你的代码在我的机器上,执行了10次new,也就是说,你的测试程序只有五个节点,但是你生成了10个节点。
知道你错在什么地方了没有?我告诉你把:
第一:正常的输出全对不代表你的程序没有问题,有很多问题要是用非正常的测试方法才能看出问题,
第二:你把问题绝对化,不用递归的方法如下:

template<class Key ,class Type>
CBSTree<Key,Type>& CBSTree<Key,Type>::Insert(Key key,const Type & x)
{
PBTN p = new BTN;
p->key = key;
p->object = x;

PBTN pr = root,pp = NULL;

while(pr)
{
pp = pr;

if(pr->key > key)
pr = pr->leftchild;
else
pr = pr->rightchild;
}

if(root)
{
if(key < pp->key)
pp->leftchild = p;
else
pp->rightchild = p;
}
else
root = p;

return *this;
}
第三:你真得很自大,
robin97 2003-02-12
  • 打赏
  • 举报
回复
struct BTREE
{
int nValue;
BTREE* Bleft;
BTREE* Bright;
};

int i = 0; // 这是我加的,我加的全部都是测试代码,
// 顺便让你们看看,为什么内存会耗尽,而且连错在哪里都不懂
void InsertNode(int value, BTREE* &bTree)
{

BTREE* pnewTree = new BTREE;
cout<< i++<<' '; // 这是我加的,目的在于看看执行了多少次new
// 正常的话应该是添加多少节点就有多少次
// 看看你的程序执行了多少次new吧,还敢说没错
pnewTree->nValue = value;
pnewTree->Bleft = NULL;
pnewTree->Bright = NULL;

if ( bTree == NULL)
{
bTree = pnewTree;
}
else
{
if (value > bTree->nValue)
{
InsertNode(value,bTree->Bright);
}
else
{
InsertNode(value,bTree->Bleft);
}

}

}

void InOrder(BTREE* bTree)
{
if (bTree != NULL)
{
printf("%d ",bTree->nValue);
InOrder(bTree->Bleft);
InOrder(bTree->Bright);
}
}

int main(int argc, char* argv[])
{
//printf("Hello World!\n");
BTREE* m_tree = NULL;

InsertNode(10, m_tree);
InsertNode(20,m_tree);
InsertNode(5,m_tree);
InsertNode(3,m_tree);
InsertNode(30,m_tree);

cout<<endl; // 这是我加的
InOrder(m_tree);
return 0;
}

bluetit 2003-02-11
  • 打赏
  • 举报
回复
up
落入凡间的猪 2003-02-11
  • 打赏
  • 举报
回复
对了,这个我在vc6.0下通过,并且也是对的

打印结果如下:10 5 3 20 30
落入凡间的猪 2003-02-11
  • 打赏
  • 举报
回复
你说说看看,插入不递归,该怎么实现??

按照windcsn(各位新年洋洋得意)的说法应该把 pNewTree 放在里面,这样就不会每次都new了,需要的时候再new
robin97 2003-02-11
  • 打赏
  • 举报
回复
肯定有问题,你插入也搞递归?每递归一次就new一次,不错才怪
落入凡间的猪 2003-02-11
  • 打赏
  • 举报
回复
呵呵,对,应该放在第一个if 里面
windcsn 2003-02-11
  • 打赏
  • 举报
回复
void InsertNode(int value, BTREE* &bTree)
{

BTREE* pnewTree = new BTREE;
pnewTree->nValue = value;
pnewTree->Bleft = NULL;
pnewTree->Bright = NULL;

if ( bTree == NULL)
{
bTree = pnewTree;
}
else
{
if (value > bTree->nValue)
{
InsertNode(value,bTree->Bright);
}
else
{
InsertNode(value,bTree->Bleft);
}

}

}
应该首先判断是否bTree是否为NULL,否则再new,这样写会不会好一些,不要每次都new出来这个不必要的pNewTree,如果你这样,你还需要delete,否则会有内存泄露
落入凡间的猪 2003-02-11
  • 打赏
  • 举报
回复
Iong(有来有分) 说的是
落入凡间的猪 2003-02-11
  • 打赏
  • 举报
回复
还有建议不要把pNewTree声明为point

因为连表用的是堆,我想必须这么用吧,这样做好象不行吧
if ( bTree == NULL)
{

BTREE pnewTree;
//申明了没有初始化
pnewTree.nValue = value;
pnewTree.Bleft = NULL;
pnewTree.Bright = NULL;

bTree = &pnewTree;
}
Iong 2003-02-11
  • 打赏
  • 举报
回复
从面向对象的角度来说
这样
class BTree
{
class _node
{
_node *left;
_node *right;
data _data;
...构造,析构函数等
}
public:
...构造,析构函数等
_node *_root;
virtual insert(...);
virtual remove(...);
}
才更像是C++而不是C
落入凡间的猪 2003-02-11
  • 打赏
  • 举报
回复
to langhaixin(阿!又错了) :

void InsertNode(int value, BTREE* &bTree) //又是* 又是& 笔误吧!!!

不是笔误,因为bTree要改变,如果你只写BTREE* 的话,他只是m_tree的copy,实际上没有改变m_tree,所以我用了reference.

windcsn 2003-02-11
  • 打赏
  • 举报
回复
to langhaixin(阿!又错了)
我想他第一次的不应该delete,否则生成的树就不对了,因为你在退出函数的时候已经delete了,你还将地址给外面,那么访问肯定异常,所以只要判断就不需要delete了,但是在最后删除tree的时候需要一一delete
langhaixin 2003-02-11
  • 打赏
  • 举报
回复
同意windcsn(各位新年洋洋得意) 不过不要望了在最好把pNewTree delete了;否则就是memory leak,还有函数的声明
void InsertNode(int value, BTREE* &bTree) //又是* 又是& 笔误吧!!!
还有建议不要把pNewTree声明为point,一来没有必要,二来防止memory leak,反正btree也不是什么大型的结构,声明为object不会有过重的负担,
如果实在不愿意承受object带来的负担,也可以声明为引用

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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