二叉树(含有duplicates字段来实现懒惰删除,还有完全删除节点)

 
#include  < stdio.h >
#include 
< malloc.h >
#include 
< time.h >
#include 
< stdlib.h >
typedef 
struct  BiTree
{
    
int value;
    
int duplicates;
    
struct BiTree *left,*right;
}
BiTree;
BiTree
*  CreateBiTree() /**/ /*return dummy root */
{
    BiTree 
*node=(BiTree*)malloc(sizeof(BiTree));
    node
->left=NULL;
    node
->right=NULL;
    
return node;
}

int  SearchNode(BiTree  * root,BiTree  ** parent,BiTree  ** node, int  x)
/**/ /*if exist return 1,else return 0*/
/**/ /*parent:return the parent of the node with value of x*/
{
    BiTree 
*p1;/**//*used as node*/
    BiTree 
*p2/**//*used as parent node*/;
    p1
=root->left,p2=root;
    
while(p1!=NULL)
    
{
        
if(x==p1->value)
        
{
            
*node=p1;/**//*motify the node and parent*/
            
*parent=p2;
            
return 1;
        }

        
else if(x<p1->value)
        
{
            p2
=p1;
            p1
=p1->left;
        }

        
else if(x>p1->value)
        
{
            p2
=p1;
            p1
=p1->right;
        }

    }

    
*node=p1;/**//*motify the node and parent*/
    
*parent=p2;
    
return 0;
}

int  InsertNode(BiTree  * root, int  x)
{
/**//*if x exist in BiTree ,return 0*/
/**//*else return 1;*/
    BiTree 
*parent=NULL,*node=NULL;
    
if(SearchNode(root,&parent,&node,x)==1)/**//*if x eixst in Bitree */
    
/**//*duplicates++*/
    
{
        node
->duplicates++;
        
return 0;
    }

    
else
    
{
        node
=(BiTree*)malloc(sizeof(BiTree));
        node
->value=x;
        node
->duplicates=1;
        node
->left=NULL;
        node
->right=NULL;
        
if(parent==root)
            root
->left=node;
        
else if(x<parent->value)
            parent
->left=node;
        
else if(x>parent->value)
            parent
->right=node;
        
return 1;
    }

}

void  FreeBiTree(BiTree *  root)
{
    BiTree 
*left=NULL,*right=NULL;
    
if(root!=NULL)
    
{
        left
=root->left;
        right
=root->right;
        free(root);
        FreeBiTree(left);
        FreeBiTree(right);
    }

}

int  DeleteNode(BiTree  * root, int  x)
{
/**//*if x exist in BiTree ,return 1*/
/**//*else return 0;*/
    BiTree 
*node=NULL,*parent=NULL;
    BiTree 
*p1=NULL,*p2=NULL;
    
int result;
    result
=SearchNode(root,&parent,&node,x);
    
if(result==0)
        
return 0;/**//*x doesn't exist in the BiTree */
    
else
    
{
        
if(node->duplicates>1)
        
{
            printf(
"Duplicate>1 ");
              node
->duplicates--;/**//*lazy delete*/
        }
          
        
else/**//*delete node which duplicates is zero*/
        
{
            
if((node->left==NULL)&&(node->right==NULL))
            
{
                
if(node==parent->left)
                    parent
->left=NULL;
                
else if(node==parent->right)
                    parent
->right=NULL;
                free(node);
            }
 
            
else if((node->left!=NULL)&&(node->right!=NULL))
            
{
                p1
=node;
                p2
=node->right;
                
if(p2->left==NULL)
                
{
                    p1
->value=p2->value;
                    p1
->duplicates=p2->duplicates;
                    p1
->right=p2->right;
                    free(p2);
                }

                
else
                
{
                    
while(p2->left!=NULL)
                    
{
                        p1
=p2;
                        p2
=p2->left;
                    }

                    node
->value=p2->value;
                    node
->duplicates=p2->duplicates;
                    p1
->left=p2->right;
                    free(p2);
                }

            }

            
else if(node->left!=NULL)
            
{
                
if(parent->left==node)
                    parent
->left=node->left;
                
else if(parent->right==node)
                    parent
->right=node->left;
                free(node);
            }

            
else if(node->right!=NULL)
            
{
                
if(parent->left==node)
                    parent
->left=node->right;
                
else if(parent->right==node)
                    parent
->right=node->right;
                free(node);
            }

        }

        
return 1;
    }

}

void  Traverse(BiTree  * root, int  depth)
{
    
int i;
    
if(root==NULL)
        
return ;
    
else
    
{
        Traverse(root
->left,depth+1);
        
for(i=0;i<depth;i++)
            putchar(
'*');
        printf(
"%d ",root->value);
        Traverse(root
->right,depth+1);
        
return ;
    }

}

int  main()
{
    
int i,size=100,x;
    BiTree 
*root;
    srand((unsigned)time(NULL));
    root
=CreateBiTree();
    
for(i=0;i<size;i++)
    
{
        x
=rand();
        InsertNode(root,x);        
    }

    Traverse(root
->left,0);
    
while(x!=0)
    
{
        scanf(
"%d",&x);
        DeleteNode(root,x);
        printf(
"After DeleteNode ");
        Traverse(root
->left,0);
    }

    FreeBiTree(root);
/**//*because is't dummy*/
    
return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值