免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1582 | 回复: 1
打印 上一主题 下一主题

[C] 二叉树递归的一点问题,帮忙看看,谢谢了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-15 10:19 |只看该作者 |倒序浏览
satic void Inorder(const Node *root,void(*fun)(Item item))
{
        if(root!=NULL)
        {
                Inorder(root->left,pfun);
                (*pfun)(root->item);
                Inorder(root->right,pfun);
        }
}
我问题是这样的:
(*pfun)(root->item);这个函数具体是怎么实现的?我在下面接口函数文件中找不到?他的具体作用是用来处理树结点中的项目的(也即data)?



接口函数文件:
/*tree.c*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"tree.h"



#define true 1
#define false 0


typedef struct pair
{
        Node *parent;
        Node *child;

}Pair;

static Node *MakeNode(const Item *pi);
static int ToLeft(const Item *i1,const Item *i2);
static int ToRight(const Item *i1,const Item *i2);
static void AddNode(Node *new_node,Node *root);
static void Inorder(const Node *root,void (*pfun)(Item item));
static Pair SeekItem(const Item *pi,const Tree *ptree);
static void DeleteNode(Node **ptr);
static void DeleteAllNodes(Node *ptr);



void InitializeTree(Tree *ptree)
{
        ptree->root=NULL;
        ptree->size=0;

}
int TreeIsEmpty(const Tree *ptree)
{
        if(ptree->root==NULL)
                return true;
        else
                return false;
}

int TreeIsFull(const Tree *ptree)
{
        if(ptree->size==MAXITEMS)
                return true;
        else
                return false;
}

int TreeItemCount(const Tree *ptree)
{
        return ptree->size;
}


int AddItem(const Item *pi,Tree *ptree)
{
        Node *new_node;
        if(TreeIsFull(ptree))
        {
                fprintf(stderr,"Tree is full\n");
                return false;

        }

        if(SeekItem(pi,ptree).child!=NULL)
        {
                fprintf(stderr,"Attempted to add duplicate");
                return false;

        }
        new_node=MakeNode(pi);
        if(new_node==NULL)
        {
                fprintf(stderr,"Could't create node\n");
                return false;
        }
        ptree->size++;
        if(ptree->root==NULL)
                ptree->root=new_node;
        else
                AddNode(new_node,ptree->root);
        return true;
}

int InTree(const Item *pi,const Tree *ptree)
{
        return (SeekItem(pi,ptree).child==NULL)?false:true;
}


int DeleteItem(const Item *pi,Tree *ptree)
{
        Pair look;
        look= SeekItem(pi,ptree);
        if(look.child==NUll)
                return false;
        if(look.parent==NULL)
                DeleteNode(&ptree->root);
        else if(look.parent->left==look.child)
                DeleteNode(&look.parent->left);
        else
                DeleteNode(&look.parent->right);

        ptree->size--;

        return true;


}

void Traverse(const Tree *ptree,void(*pfun)(Item item))
{
        if(ptree!=NULL)
                Inorder(ptree->root,pfun);

}

void DeleteALL(Tree *ptree)
{
        if(ptree!=NULL)
                DeleteAllNodes(ptree->root);
        ptree->root=NULL;
        ptree->size=0;
}

satic void Inorder(const Node *root,void(*fun)(Item item))
{
        if(root!=NULL)
        {
                Inorder(root->left,pfun);
                (*pfun)(root->item);
                Inorder(root->right,pfun);
        }
}

static void DeleteAllNodes(Node *root)
{
        Node *pright;
        if(root!=NULL)
        {
                pright=root->right;
                DeleteAllNodes(root->left);
                free(root);
                DeleteAllNodes(pright);

        }
}

static Node *MakeNode(const Item *pi)
{
        Node *new_node;
        new_node=(Node*)malloc(sizeof(Node));
        if(new_node!=NULL)
        {
                new_node->item=*pi;
                new_node->left=NULL;
                new_node->right=NULL;
        }
        return new_node;
}

static void AddNode(Node *new_node,Node *root)
{
        if(ToLeft(&new_node->item,&root->item))
        {
                if(root->left==NULL)
                        root->left=new_node;
                else
                        AddNode(new_node,root->left);

        }
        else if(ToRight(&new_node->item,&item->item))
        {
                if(root->right==NULL)
                        root->right=new_node;
                else
                        AddNode(new_node,root->right);

        }
        else
        {
                fprintf(stderr,"location error in AddNode()\n");
                exit(1);
        }


}


static int ToLeft(const Item *i1,const Item *i2)
{
        int comp1;

        if((comp1=strcomp(i1->petname,i2->petname))<0)
                return true;
        else if(comp1==0&&strcmp(i1->petkind,i2->petkind)<0)}
                return true;
        else
                return false;

}

static int ToRight(const Item *i1,const Item *i2)
{
        int comp1;

        if((comp1=strcomp(i1->petname,i2->petname))>0)
                return true;
        else if(comp1==0&&strcmp(i1->petkind,i2->petkind)>0)}
                return true;
        else
                return false;

}

static Pair SeekItem(const Item *pi,const Tree *ptree)
{
        Pair look;
        look.parent =NULL;
        look.child =ptree->root;

        if(look.child==NULL)
                return look;
        while(look.child!=NULL)
        {
                if(ToLeft(pi,&(look.child->item)))
                {
                        look.parent =look.child;
                        look.child =look.child->left;
                }
                else(ToRight(pi,&(look.child->item)))
                {
                        look.parent=look.child;
                        look.child=look.child->right;
                }
                else
                        break;

        }
        return look;

}


static void DeleteNode(Node **ptr)
{
        Node *temp;

        puts((*ptr)->item.petname);
        if((*ptr)->left==NULL)
        {
                temp=*ptr;
                *ptr=(*ptr)->right;
                free(temp);
        }
        else if((*ptr)->right==NULL)
        {
                temp=*ptr;
                *ptr=(*ptr)->left;
                free(temp);
        }
        else
        {
                for(temp=(*ptr)->left;temp->right!=NULL;temp=temp->right)
                        continue;

                temp->right=(*ptr)->right;
                temp=*ptr;
                *ptr=(*ptr)->left;
                free(temp);

        }
}















































论坛徽章:
0
2 [报告]
发表于 2008-10-15 11:54 |只看该作者
(*pfun)(root->item);这个函数具体是怎么实现的?我在下面接口函数文件中找不到?他的具体作用是用来处理树结点中的项目的(也即data)?


pfun指向的函数是需要用户定义的,用来处理树节点数据,比方说输出什么的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP