关于二叉树的删除问题,请教大神~
各位大神,请教下: 在二叉树之中,如何实现节点的删除操作? 书上介绍的是使用双重指针,但是我觉得只要是对地址操作就能实现对整个树的操作,可是实现起来实现不了删除,同时也没法释放free。 请问是什么原因? 目前对双重指针不理解,如果找到了原因所在,对指针的理解肯定会更深入。 先多谢各位大神~ 代码如下: 整段代码都是可以编译运行的! // 问题子函数— find_tree() —现在代码使用的是双重指针,问题1: 找到 value的节点,删除后,只输出value节点以下的数据,以上数据丢失,同时会产生两次同样的打印。 大神们帮我看下是啥原因? 哪个地方错了? 如果不使用双重指针,会产生删除的节点会打印成 0, 同时节点以下部分会重复输出!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<setjmp.h>
#define TREE_TYPE int
typedef struct my_tree{
TREE_TYPE i;
struct my_tree *right;
struct my_tree *left;
}tree;
void create_tree(tree *tmp,TREE_TYPE value)
{
tree *new,*p;
while(tmp != NULL)
{
if(value == tmp->i)
{ printf("Value already exists!\n"); return; }
if(value > tmp->i)
{ new=tmp; tmp = tmp->right; }
else
{ new=tmp; tmp = tmp->left; }
}
p = malloc(sizeof(tree)); p->i = value;
if(value > new->i) new->right = p;
else new->left = p;
p->right = NULL;p->left =NULL;
}
void pre_print_tree(tree *tmp)
{
if(tmp == NULL) return;
printf("%d\t",tmp->i);
pre_print_tree(tmp->left);
pre_print_tree(tmp->right);
}
void find_tree(tree **tmp,TREE_TYPE value) //删除函数通过查找函数修改过来的, 查找函数没有问题! 问题点就在这一个子函数。
{
tree *del;
while(*tmp)
{
if(value == (*tmp)->i)
{
if((*tmp)->right == NULL && (*tmp)->left == NULL)
{ free(*tmp); *tmp=NULL;return ;}
if((*tmp)->right == NULL)
{ del=*tmp;*tmp=(*tmp)->left; free(del);return ;}
if((*tmp)->left == NULL)
{ del=*tmp;*tmp=(*tmp)->right; free(del);return ;}
else
{
del=(*tmp)->right;
while(del->left) del=del->left;
del->left = (*tmp)->left; free(*tmp);
return ;
}
}
else if((value > (*tmp)->i) && ((*tmp)->right != NULL)) *tmp = (*tmp)->right;
else if((value < (*tmp)->i) && ((*tmp)->left != NULL)) *tmp = (*tmp)->left;
}
printf("the value isn't exist!\n");
}
void main()
{
static tree *boot;
TREE_TYPE j=1;
boot = malloc(sizeof(tree));
printf("Please enter the date of boot:");
scanf("%d",&(boot->i));
boot->right = NULL; boot->left = NULL;
while(j)
{
printf("Please enter the new data:");
scanf("%d",&j);
if(j == 0) continue;
create_tree(boot,j);
}
pre_print_tree(boot); //Preorder Traversal
printf("\n");
printf("Please enter the value you want to delete:");
scanf("%d",&j);
find_tree(&boot,j);
pre_print_tree(boot); //Preorder Traversal
printf("\n");
}