首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

哪位高手能帮小弟我看看这个代码如何了

2013-09-11 
谁能帮我看看这个代码怎么了#include stdio.h#include stdlib.htypedef int Status#define OK 1#defi

谁能帮我看看这个代码怎么了

#include <stdio.h>
#include <stdlib.h>

typedef int Status;
#define OK 1
#define FALSE 0

/* 二叉链表的结点结构 */
typedef int BElemType;
typedef struct BiTNode
{
    BElemType data;    /* 结点数据 */
    struct BiTNode *lchild, *rchild;   /* 左右孩子指针 */
} BiTNode, *BiTree;

/* 即将在主函数中调用的函数 */
void CreateBiTree(BiTree *T);
void InOrderTraverse(BiTree T);

int main(void)
{
    BiTree T;

    /* 建立二叉排序树 */
    CreateBiTree(&T);

    /* 中序遍历查看建立的二叉排序树 */
    InOrderTraverse(T);

    return 0;
}

/* 二叉排序树的查找操作(递归)
 * T为待查找的二叉排序树
 * key为要查找的关键字
 * f为指向双亲结点的指针,初始时为NULL
 * 当查找成功时,p指向查找到的结点,当查找失败时,
 * p指向最后一次访问到的结点
 */
Status SearchBST(BiTree T, BElemType key, BiTree f, BiTree *p)
{
    if (T == NULL) {
        *p = f;
        return FALSE;
    }

    else if (key == T->data) {
        *p = T;
        return OK;
    }
    else if (key < T->data)
        return SearchBST(T->lchild, key, T, p);
    else
        return SearchBST(T->rchild, key, T, p);
}

/* 二叉排序树的插入操作 */
Status InsertBST(BiTree *T, BElemType key)
{
    BiTree p, s;

    if (!SearchBST(*T, key, NULL, &p)) {          /* 当二叉排序树中没有key时进行插入操作 */
        s = (BiTree)malloc(sizeof(BiTNode));
        s->data = key;
        s->lchild = s->rchild = NULL;

        if (!*T)     /* 当为空树时 */


            *T = s;        /* 插入s为根结点 */
        else if (key < p->data)
            p->lchild = s;
        else
            p->rchild =s;

        return OK;
    }
    else
        return FALSE;
}

/* 二叉排序树的建立 */
#define MAXSIZE 100
void CreateBiTree(BiTree *T)
{
    int i, num;
    BElemType data[MAXSIZE];
    *T = NULL;       /* 初始化为空树 */

    printf("输入结点个数: ");
    scanf("%d", &num);

    for (i = 0; i < num; i++)
        scanf("%d", &data[i]);

    for (i = 0; i < num; i++)      /* 利用二叉排序树的插入操作建立二叉排序树 */
        InsertBST(T, data[i]);
}

/* 二叉树的中序遍历 */
void InOrderTraverse(BiTree T)
{
    if (T == NULL) {
        printf("二叉树为空 !\n");
        exit(1);
    }

    InOrderTraverse(T->lchild);
    printf("%d", T->data);
    InOrderTraverse(T->rchild);
}



最后显示的结果为:
输入结点个数: 10
62
88
58
47
35
73
51
99
37
93
二叉树为空 !
原来楼主插入没啥大问题 有问题的是遍历函数 直接 exit(1)了,要知道 递归的时候都是先走到节点为空以后才往上面一层一层的递归的,所以 当走到递归的最深层的时候楼主就退出程序了  后面的东西没来得及打印出来,上代码



// BTree.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
typedef int Status;
#define OK 1
#define FALSE 0
 
/* 二叉链表的结点结构 */
typedef int BElemType;
typedef struct BiTNode
{
    BElemType data;    /* 结点数据 */
    struct BiTNode *lchild, *rchild;   /* 左右孩子指针 */
} BiTNode, *BiTree;
 
/* 即将在主函数中调用的函数 */
void CreateBiTree(BiTree *T);
void InOrderTraverse(BiTree T);
 

 
/* 二叉排序树的查找操作(递归)
 * T为待查找的二叉排序树
 * key为要查找的关键字
 * f为指向双亲结点的指针,初始时为NULL
 * 当查找成功时,p指向查找到的结点,当查找失败时,
 * p指向最后一次访问到的结点
 */
Status SearchBST(BiTree T, BElemType key, BiTree f, BiTree *p)
{
    if (T == NULL) {
        *p = f;
        return FALSE;
    }
 
    else if (key == T->data) {
        *p = T;
        return OK;
    }
    else if (key < T->data)
        return SearchBST(T->lchild, key, T, p);
    else
        return SearchBST(T->rchild, key, T, p);
}
 
/* 二叉排序树的插入操作 */
Status InsertBST(BiTree *T, BElemType key)
{
    BiTree p, s;
 
    if (!SearchBST(*T, key, NULL, &p)) {          /* 当二叉排序树中没有key时进行插入操作 */
        s = (BiTree)malloc(sizeof(BiTNode));
        s->data = key;
        s->lchild = s->rchild = NULL;
 
        if (!*T)     /* 当为空树时 */
            *T = s;        /* 插入s为根结点 */
        else if (key < p->data)


            p->lchild = s;
        else
            p->rchild =s;
 
        return OK;
    }
    else
        return FALSE;
}
 
/* 二叉排序树的建立 */
#define MAXSIZE 100
void CreateBiTree(BiTree *T)
{
    int i, num;
    BElemType data[MAXSIZE];
    *T = NULL;       /* 初始化为空树 */
 
    printf("输入结点个数: ");
    scanf("%d", &num);
 
    for (i = 0; i < num; i++)
        scanf("%d", &data[i]);
    for (i = 0; i < num; i++)      /* 利用二叉排序树的插入操作建立二叉排序树 */
        InsertBST(T, data[i]);
}
 
/* 二叉树的中序遍历 */
void InOrderTraverse(BiTree T)
{
    if (T == NULL) {
       // printf("二叉树为空 !\n");
       // exit(1);
return;//别直接退出程序,不方便调试啊!
    }
 
    InOrderTraverse(T->lchild);
printf("%d  ", T->data);//%d后面加个空格或者换行社么的,免得打印出来的是一串数字
    InOrderTraverse(T->rchild);
}

int _tmain(int argc, _TCHAR* argv[]){
BiTree T;

/* 建立二叉排序树 */
CreateBiTree(&T);

/* 中序遍历查看建立的二叉排序树 */
InOrderTraverse(T);

int i = 0;
system("pause");

return 0;
}



哪位高手能帮小弟我看看这个代码如何了

热点排行