#include<iostream>
#include<vector>
using namespace std;
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
}binode,*bitree;
bitree initree(binode *root)//创建二叉树
{
bitree tree=root;
return tree;
}
binode *makenode(int item,binode *lchild,binode *rchild)//增加节点
{
binode *pnode;
pnode=(binode *)malloc(sizeof(binode));
if(pnode)
{
pnode->data=item;
pnode->lchild=lchild;
pnode->rchild=rchild;
}
return pnode;
}
void midorder(bitree tree,void (*visit)(int item))//中序遍历
{
binode *pnode=tree;
if(pnode)
{
midorder(pnode->lchild,visit);
visit(pnode->data);
midorder(pnode->rchild,visit);
}
}
void lineorder(bitree tree)//层序遍历
{
binode *pnode=tree;
vector<binode *>vec;
if(tree==NULL)
return;
else
vec.push_back(pnode);
int cd=0,rd=1;
while(cd<vec.size())
{
rd=vec.size();
while(cd<rd)
{
cout<<vec[cd]->data<<endl;
if(vec[cd]->lchild != NULL)
vec.push_back(vec[cd]->lchild);
if(vec[cd]->rchild != NULL)
vec.push_back(vec[cd]->rchild);
++cd;
}
}
}
void print(int item)
{
cout<<item<<endl;
}
binode *insert(bitree tree,int k)//二叉排序树插入节点
{
binode *pnode;
pnode=tree;
if(pnode==NULL)
{
pnode=(binode *)malloc(sizeof(binode));
pnode->data=k;
pnode->lchild=NULL;
pnode->rchild=NULL;
return pnode;
}
else if(k==pnode->data)
return pnode;
else if(k<pnode->data)
{
pnode->lchild=insert(pnode->lchild,k);
return pnode;
}
else
{
pnode->rchild=insert(pnode->rchild,k);
return pnode;
}
}
bitree del(bitree tree,int k)//二叉排序树删除节点
{
if(tree==NULL)
{
cout<<"树为空"<<endl;
return NULL;
}
binode *pnode=tree,*pre;
while(pnode->data!=k&&pnode!=NULL)
{
pre=pnode;
if(k<pnode->data)
pnode=pnode->lchild;
else
pnode=pnode->rchild;
}
if(pnode==NULL)
{
cout<<"未找到"<<endl;
return tree;
}
if(pnode->lchild==NULL&&pnode->rchild==NULL)
{
if(pre==NULL)
{
free(pnode);
return NULL;
}
else if(pnode->data<pre->data)
{
pre->lchild=NULL;
free(pnode);
return tree;
}
else
{
pre->rchild=NULL;
free(pnode);
return tree;
}
}
else if(pnode->lchild==NULL&&pnode->rchild!=NULL)
{
if(pre==NULL)
{
tree=pnode->rchild;
free(pnode);
return tree;
}
else if(pnode->data<pre->data)
{
pre->lchild=pnode->rchild;
free(pnode);
return tree;
}
else
{
pre->rchild=pnode->rchild;
free(pnode);
return tree;
}
}
else if(pnode->lchild!=NULL&&pnode->rchild==NULL)
{
if(pre==NULL)
{
tree=pnode->lchild;
free(pnode);
return tree;
}
else if(pnode->data<pre->data)
{
pre->lchild=pnode->lchild;
free(pnode);
return tree;
}
else
{
pre->rchild=pnode->lchild;
free(pnode);
return tree;
}
}
else //if(pnode->lchild!=NULL&&pnode->rchild!=NULL)
{
binode *p;
p=pnode->rchild;
if(pre==NULL)
{
while(p->lchild!=NULL)
p=p->lchild;
int temp;
temp=p->data;
del(pnode,p->data);
pnode->data=temp;
return tree;
}
else
{
while(p->lchild!=NULL)
p=p->lchild;
int temp=p->data;
del(pnode,p->data);
pnode->data=temp;
return tree;
}
}
}
void search(bitree tree,int k)//二叉树查找
{
binode * pnode;
pnode=tree;
if(pnode==NULL)
cout<<"不成功";
else if(tree->data==k)
cout<<"查找成功";
else if(k<tree->data)
{
search(tree->lchild,k);
}
else
{
search(tree->rchild,k);
}
}
int main()
{
binode * n1 = makenode(2,NULL,NULL);
binode * n2 = makenode(1,NULL,n1);
binode * n3 = makenode(5,NULL,NULL);
binode * n4 = makenode(7,NULL,NULL);
binode * n5 = makenode(3,n2,NULL);
binode * n6 = makenode(6,n3,n4);
binode * n7 = makenode(4,n5,n6);
bitree tree=initree(n7);
tree=del(tree,4);
lineorder(tree);
return 0;
}