二叉树(含有duplicates字段来实现懒惰删除,还有完全删除节点)
来源:互联网 发布:美苹互联域名如何解析 编辑:程序博客网 时间:2024/06/14 04:57
#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;
}
#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;
}
- 二叉树(含有duplicates字段来实现懒惰删除,还有完全删除节点)
- 二叉查找树——懒惰删除
- 二叉树删除节点
- 二叉树删除节点
- 二叉树删除节点
- 二叉搜索树节点删除 java实现
- AVL树实现非懒惰删除
- 删除二叉树的节点
- 二叉查找树删除节点
- 二叉搜索树删除节点
- 二叉树中节点删除
- 二叉树节点的删除
- 二叉树的节点删除
- 二叉树删除某个节点
- Java实现二叉搜索树节点的删除
- JavaScript二叉查找树删除节点的实现原理
- 二叉搜索树---AVL树删除节点
- 二叉搜索树——删除节点
- 如何在网页中加入一条竖线
- dedict 论坛布置完毕,
- js入门·对象属性方法大总结
- sql server 2005 T-SQL BETWEEN (Transact-SQL)
- sql server 2005 T-SQL binary 和 varbinary (Transact-SQL)
- 二叉树(含有duplicates字段来实现懒惰删除,还有完全删除节点)
- sql server 2005 T-SQL BINARY_CHECKSUM
- 偶滴儿子5个月大了
- sql server 2005 T-SQL bit (Transact-SQL)
- ioctl 详细说明
- 1/3的效率提高!
- sql server 2005 T-SQL BULK INSERT (Transact-SQL)
- The Mythical Man-Month (Read recording) Chapter 1
- java关于(io&nio) 的 文件copy例子