| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 615 人关注过本帖
标题:请教各位一个问题,构造了一个排序二叉树,无输出,真心求指教
只看楼主 加入收藏
workhardsun
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-8-21
结帖率:0
收藏
已结贴  问题点数:10 回复次数:3 
请教各位一个问题,构造了一个排序二叉树,无输出,真心求指教
我构造了一个排序二叉树,插入操作后,中序遍历打印输出,但是没有结果,指向根节点的指针竟然是NULL,
不知道哪里有问题,求指教
程序代码:
#include "stdafx.h"
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
#define N 10
//定义数据结构

struct datetype
{
    int key;
    int other;
};

typedef struct BiTNode
{
    datetype data;
    struct BiTNode *lchild,*rchild; /* 左右孩子指针 */

 }BiTNode,*BiTree;

void inittable(BiTNode *p)
{
     p=NULL;


}

//查找
//函数输入参数:树的指针,查找的关键字,节点的双亲指针,找到节点指针,查找结果标志位
void search(BiTNode *T,int key,BiTNode *f,BiTNode *p,int *flag)
{
    //相关的初始化,看看符不符合要求
    if(T==NULL)
    {
        *flag=0;
        p=f;//返回T的上个指针,即查找不成功,停止的指针的位置
    }
    else
    {
        if(key==T->data.key)
        {
            *flag=1;
            p=T;
        }
        else
            if(key<=T->data.key)
                search(T->lchild,key,T,p,flag);
            else
                search(T->rchild,key,T,p,flag);
    }

}

//删除

//插入


int  insertBST(BiTNode *T,struct datetype e)
{
    int flag;
    BiTNode *p=NULL,*s;
    search(T,e.key,NULL,p,&flag);
    if(flag==0)
    {
        printf("find falure!\n");
        s=(BiTNode *)malloc(sizeof(BiTNode));
        s->data=e;
        s->lchild=s->rchild=NULL;
        if(!p)
           T=s;
        else
        if (e.key<(p->data.key))
        {
            p->lchild=s;
        }
        else
            p->rchild=s;

        return 0;
    }
    else
        return 1;//树中已有关键字
}

//访问
void print(struct datetype c)
{
    printf("(%d,%d) ",c.key,c.other);
}

void TraverseDSTable(BiTNode *DT,void(*Visit)(struct datetype))
{ /* 初始条件: 动态查找表DT存在,Visit是对结点操作的应用函数 */
    /* 操作结果: 按关键字的顺序对DT的每个结点调用函数Visit()一次且至多一次 */
    if(DT)
    {
        TraverseDSTable(DT->lchild,Visit); // 先中序遍历左子树
        printf("ok\n");
        Visit(DT->data); //再访问根结点
        TraverseDSTable(DT->rchild,Visit); //最后中序遍历右子树
    }
    else
        if(DT==NULL)
        {
            printf("没有数据在树中\n");
        }
   

 }

int main(void)
{
    BiTNode *p,*dt=NULL;

    int i;
    int  j;
    struct datetype  r[N]={{45,1},{12,2},{53,3},{3,4},{37,5},{24,6},{100,7},{61,8},{90,9},{78,10}}; /* 以教科书图9.7(a)为例 */
   
    for(i=0;i<N;i++)
    {
        j=insertBST(dt,r[i]); /* 依次插入数据元素 */
        if(j==0)
            printf("insert sucessfull!\n");
    }
    TraverseDSTable(dt,print);
    return 0;
}
搜索更多相关主题的帖子: 真心 打印 二叉树 
2012-08-21 10:29
workhardsun
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-8-21
收藏
得分:0 
恩 大家肯定没有耐心看这些代码
我是根据书中的思路自己修改的;
书中定义了节点的结构
typedef struct BiTNode
{
    datetype data;
    struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
在mian函数中定义的是
BiTree dt
InsertBST(&dt,r[i]);

我的理解是dt是指向结构体的指针;
&dt是对dt这个指针变量取地址操作,就是得到这个指针的地址,是不是这样子的;
我是直接定义一个指向结构体变量的指针,传递指针,然后操作的


void SearchBST1(BiTree *T,KeyType key,BiTree f,BiTree *p,Status *flag) /* 算法9.5(b)改 */
 { /* 在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找 */
   /* 成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上 */
   /* 访问的最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL */
   if(!*T) /* 查找不成功 */
   {
     *p=f;
     *flag=FALSE;
   }
   else if EQ(key,(*T)->data.key) /*  查找成功 */
   {
     *p=*T;
     *flag=TRUE;
   }
   else if LT(key,(*T)->data.key)
     SearchBST1(&(*T)->lchild,key,*T,p,flag); /* 在左子树中继续查找 */
   else
     SearchBST1(&(*T)->rchild,key,*T,p,flag); /*  在右子树中继续查找 */
 }

 Status InsertBST(BiTree *T, ElemType e)
 { /* 当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回TRUE, */
   /* 否则返回FALSE。算法9.6(改) */
   BiTree p,s;
   Status flag;
   SearchBST1(T,e.key,NULL,&p,&flag);
   if(!flag) /* 查找不成功 */
   {
     s=(BiTree)malloc(sizeof(BiTNode));
     s->data=e;
     s->lchild=s->rchild=NULL;
     if(!p)
       *T=s; /* 被插结点*s为新的根结点 */
     else if LT(e.key,p->data.key)
       p->lchild=s; /* 被插结点*s为左孩子 */
     else
       p->rchild=s; /* 被插结点*s为右孩子 */
     return TRUE;
   }
   else
     return FALSE; /* 树中已有关键字相同的结点,不再插入 */
 }
2012-08-21 10:50
轮椅之星
Rank: 2
等 级:论坛游民
帖 子:18
专家分:42
注 册:2012-8-16
收藏
得分:10 
楼主,你要查找的关键字在哪里输入呢?
2012-08-21 19:02
workhardsun
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-8-21
收藏
得分:0 
回复 3楼 轮椅之星
恩 排序二叉树直接在比较时将数据插入
insert函数中啊
2012-08-22 07:57
快速回复:请教各位一个问题,构造了一个排序二叉树,无输出,真心求指教
数据加载中...
 
   



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

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