这个程序很多地方没读懂,郁闷啊!

aspirer2004 2008-12-14 09:33:17
本人新手,在看一本vc++的基础教程,里面有这样一个例子:
从二叉排序树中删除一个节点。
左子树都是较小的数,右子树都是较大的数,(相对根节点来说)。
红色标记部分没看明白~
麻烦大家给解释一下,越详细越好~
谢谢~
程序如下:
#include<iostream.h>
#include<stdlib.h>

template<class T>
class binarytree;

template<class T>

class node
{
private:
node<T> * lchild,* rchild;
T info;
public:
node()
{
lchild=NULL;
rchild=NULL;
}
node(T data,node<T> *left=NULL,node<T> *right=NULL)
{
info=data;
lchild=left;
rchild=right;
}
friend class binarytree<T>;
};

template<class T>
class binarytree
{
private:
node<T> *root;
int inorder(node<T>*current);
int insert(const T&data,node<T> *&b);
int remove(const T &data,node<T> *&a,node<T> * &b);
int destroy(node<T> * current);
public:
binarytree()
{root=NULL;}
~binarytree()
{
destroy(root);
}
int creat(T *data,int n);
int inorder()
{
inorder(root);
return 0;
}
int remove(const T &data)
{
remove(data,root,root);
return 0;
}
};

template<class T>
int binarytree<T>::destroy(node<T> *current)
{
if(current!=NULL)
{
destroy(current->lchild);
destroy(current->rchild);
delete current;
}
return 0;
}

template<class T>
int binarytree<T>::insert(const T &data,node<T> * &b)
{
if(b==NULL)
{
b=new node<T>(data);
if(b==NULL)
{
cout<<"空间不足!"<<endl;
exit(1);
}
}
else if(data<b->info)
{
insert(data,b->lchild);
}
else
insert(data,b->rchild);
return 0;
}

template<class T>
int binarytree<T>::creat(T *data,int n)
{
for(int i=0;i<n;i++)
{
insert(data[i],root);
}
return 0;
}

template<class T>
int binarytree<T>::inorder(node<T>*current)
{
if(current!=NULL)
{
inorder(current->lchild);
cout<<current->info<<" ";
inorder(current->rchild);
}
return 0;
}

template<class T>
int binarytree<T>::remove(const T &data,node<T> * &a,node<T> * &b)
{
node<T> * temp1,* temp2;
if(b!=NULL)
if(data<b->info)remove(data,b,b->lchild);
else if(data>b->info)remove(data,b,b->rchild);
else if(b->lchild!=NULL&&b->rchild!=NULL)
{
temp2=b;
temp1=b->rchild;
if(temp1->lchild!=NULL)
{
while(temp1->lchild!=NULL)
{
temp2=temp1;
temp1=temp1->lchild;
}
temp2->lchild=temp1->rchild;
}
else
temp2->rchild=temp1->rchild;
b->info=temp1->info;

delete temp1;
}
else
{
temp1=b;
if(b->rchild!=NULL)
{
temp1=b->rchild;
b->info=temp1->info;
b->rchild=temp1->rchild;
b->lchild=temp1->lchild;
}
else if(b->lchild!=NULL)
{
temp1=b->lchild;
b->info=temp1->info;
b->lchild=temp1->lchild;
b->rchild=temp1->rchild;
}
else if(b==root)
root=NULL;
else if(a->rchild==temp1)
a->rchild=NULL;
else
a->lchild=NULL;
delete temp1;
}
return 0;
}

int main()
{
const int n=15;
int i,a[n]={10,5,15,8,3,18,13,12,14,16,20,1,4,6,9};
binarytree<int> btree;
btree.creat(a,n);
cout<<"输入数据:"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl<<"中序:"<<endl;
btree.inorder();
btree.remove(a[13]);
cout<<endl<<"中序:"<<endl;
btree.inorder();
btree.remove(a[3]);
cout<<endl<<"中序:"<<endl;
btree.inorder();
btree.remove(a[9]);
cout<<endl<<"中序:"<<endl;
btree.inorder();
btree.remove(a[2]);
cout<<endl<<"中序:"<<endl;
btree.inorder();
btree.remove(a[0]);
cout<<endl<<"中序:"<<endl;
btree.inorder();
int a1[1]={10};
binarytree<int>btree1;
btree1.creat(a1,1);
cout<<"输入数据:"<<"\t"<<a1[0]<<"\t";
cout<<endl<<"中序:"<<"\t";
btree1.inorder();
btree1.remove(a[0]);
cout<<endl<<"中序:"<<endl;
btree1.inorder();
return 0;
}
...全文
119 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangl2512 2008-12-19
  • 打赏
  • 举报
回复
好长啊,看不下去了.........
Rainstorey 2008-12-15
  • 打赏
  • 举报
回复
1.中序遍历
2.删除节点,如果其下有子节点则查找右树最小节点来替换删除节点使得树的排序性质不变。
ToBeTough 2008-12-15
  • 打赏
  • 举报
回复
看看
aspirer2004 2008-12-15
  • 打赏
  • 举报
回复
画了图了,还做了断点,边debug边看的,还是没看明白~
特别是递归调用那部分!
不知道怎么调的~
lann64 2008-12-14
  • 打赏
  • 举报
回复
if(temp1->lchild!=NULL)
{
while(temp1->lchild!=NULL)
{
temp2=temp1;
temp1=temp1->lchild;
}
temp2->lchild=temp1->rchild;
}
else
temp2->rchild=temp1->rchild;
b->info=temp1->info;
这一段,自己画个图就看清楚了。用文字说着啰嗦。
lhwiskoala 2008-12-14
  • 打赏
  • 举报
回复
第一个是中序遍历。
lann64 2008-12-14
  • 打赏
  • 举报
回复
懒得看,这个就是一个典型的中序遍历,先输出左子树,然后是当前节点,最后是右子树。使用了递归方法。
template <class T>
int binarytree <T>::inorder(node <T>*current)
{
if(current!=NULL)
{
inorder(current->lchild);
cout < <current->info < <" ";
inorder(current->rchild);
}
return 0;
}
SearchLife 2008-12-14
  • 打赏
  • 举报
回复
mark
bfhtian 2008-12-14
  • 打赏
  • 举报
回复
帮顶
nullah 2008-12-14
  • 打赏
  • 举报
回复
好长 先帮顶~~~~
wap21 2008-12-14
  • 打赏
  • 举报
回复
不懂,帮顶

65,211

社区成员

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

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