这个程序很多地方没读懂,郁闷啊!
本人新手,在看一本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;
}