二叉树的创建及基本操作。

来源:互联网 发布:壁虎数据激活码 编辑:程序博客网 时间:2024/05/16 19:20


#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;
}
0 0
原创粉丝点击