二叉排序树算法 插入好像不成功~
输入格式第一行:准备建树的结点个数n
第二行:输入n个整数,用空格分隔
第三行:输入待查找的关键字
第四行:输入待查找的关键字
第五行:输入待插入的关键字
输出格式
第一行:查找结果(找到输出1,找不到输出0)
第二行:查找结果(找到输出1,找不到输出0)
第三行~第八行:插入新结点后的二叉树的先、中、序遍历序列
第四行:插入新结点后的二叉树的中序遍历序列(非递归算法)
第五行:插入新结点后的二叉树的层次遍历序列
源代码:
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
Status insertNode(BiTree &T,int n) //插入函数
{
if(!T)
{
if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; //一定要进行空间分配 动态分配空间
T->data=n;
T->lchild=NULL;
T->rchild=NULL;
}
else
{
if(n<=T->data)
insertNode(T->lchild,n);
else
insertNode(T->rchild,n);
}
return OK;
}
Status CreateBiTree(BiTree &T) //初始化二叉树
{
T=NULL;
int m,n;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
insertNode(T,n);
}
return OK;
return OK;
} // CreateBiTree
Status PrintElement(ElemType e ) { // 输出元素e的值
printf("%d ", e);
return OK;
}// PrintElement
Status PreOrderTraverse( BiTree T) {
// 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句
if(T)
{
if(PrintElement(T->data))
if(PreOrderTraverse(T->lchild))
if(PreOrderTraverse(T->rchild))
return OK;
return ERROR;
}
else
return OK;
} // PreOrderTraverse
Status InOrderTraverse( BiTree T) {
// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句
if(T)
{
if(InOrderTraverse(T->lchild))
if(PrintElement(T->data))
if(InOrderTraverse(T->rchild))
return OK;
return ERROR;
}
else
return OK;
} // InOrderTraverse
Status PostOrderTraverse( BiTree T) {
// 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
//补全代码,可用多个语句
if(T)
{
if(PostOrderTraverse(T->lchild))
if(PostOrderTraverse(T->rchild))
if(PrintElement(T->data))
return OK;
return ERROR;
}
else
return OK;
} // PostOrderTraverse
Status Search(BiTree T,int key,BiTree f,BiTree &p) //遍历树,查找是否存在元素
{
if(!T){p=f;return FALSE;} //查找不成功,
else if(key==T->data){p=T;return TRUE;} //查找成功
else if(key<T->data) return Search(T->lchild,key,T,p); //在左子树中继续查找
else return Search(T->rchild,key,T,p); //在柚子树中继续查找
}
Status Insert(BiTree &T,int e) //插入关键字
{
BiTree s;
BiTree p;
p=T;
if(!Search(T,e,NULL,p))
{
s=(BiTNode *)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!p) T=s; //被插入结点s为新的根结点
else if(e<p->data) p->lchild=s; //插入的是左孩子
else p->rchild=s; //插入的是柚孩子
return TRUE;
}
else return FALSE;
}
int main() //主函数
{
BiTree T;
CreateBiTree(T);
/* PreOrderTraverse(T);
putchar('\n');
InOrderTraverse(T);
putchar('\n');
PostOrderTraverse(T);
putchar('\n');*/
int i,m;
for(i=1;i<=2;i++)
{
scanf("%d",&m);
printf("%d\n",Search(T,m,NULL,T));
}
int g;
scanf("%d",&g);
Insert(T,g);
PreOrderTraverse(T);
putchar('\n');
InOrderTraverse(T);
putchar('\n');
PostOrderTraverse(T);
putchar('\n');
return OK;
}//main
/*
7
40 20 60 18 50 56 90
18
35
30
输出样例
1
0
40 20 18 30 60 50 56 90
18 20 30 40 50 56 60 90
18 30 20 56 50 90 60 40
*/
应该是search和Insert函数挂了 先序,中序,后序 排序算法没问题 测试语句注释掉了~
[ 本帖最后由 凉粉呵呵 于 2013-5-4 00:16 编辑 ]