读书人

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

发布时间: 2013-09-11 16:26:28 作者: rapoo

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

#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;
}



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

读书人网 >C语言

热点推荐