| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 430 人关注过本帖
标题:关于二叉树的删除问题,请教大神~
只看楼主 加入收藏
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:3 
关于二叉树的删除问题,请教大神~
各位大神,请教下:  在二叉树之中,如何实现节点的删除操作? 书上介绍的是使用双重指针,但是我觉得只要是对地址操作就能实现对整个树的操作,可是实现起来实现不了删除,同时也没法释放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");
}
搜索更多相关主题的帖子: 二叉树 如何 
2013-08-06 14:42
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:28 
你的这个问题不应该在这问吧

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-06 17:54
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
收藏
得分:0 
回复 2楼 小小程序猿
  不在这问,该哪问?  这是属于C语言的问题哈
2013-08-06 23:03
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
收藏
得分:0 
我发现,  在树结构下,二重指针只有在递归的时候才起根本的作用,不使用递归的话,二重指针只能相当于一重指针使用!   因为在函数递归到底后,会逐层递归返回地址,也就相当于逆向把通道连接了起来, 是不是可以这样理解呢???    但是如果函数本身是没有返回值的话,不是在递归返回之后,所有的堆栈会被释放吗???  晕头了~~~~~~


我问题的暂时解决方法用:依旧不使用函数递归,用while循环, 最后调用 memcpy() 函数解决指针的释放问题。 函数的递归还待继续研究,有进展了再贴上来!
2013-08-06 23:11
快速回复:关于二叉树的删除问题,请教大神~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012479 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved