用c语言写的! struct tree { struct tree *left; int data; struct tree *right; }; typedef struct tree treenode; typedef treenode *btree;
btree insert_node(btree root,int node) { btree newnode; btree currentnode; btree parentnode;
newnode=(btree)malloc(sizeof(treenode));
newnode->data=node; newnode->left=NULL; newnode->right=NULL;
if(root==NULL) return newnode; else { currentnode=root; while(currentnode!=NULL) { parentnode=currentnode; if(currentnode->data > node) currentnode=currentnode->left; else currentnode=currentnode->right; } if(parentnode->data > node) parentnode->left=newnode; else parentnode->right=newnode; } return root; }
btree create_btree(int *data,int len) { btree root=NULL; int i;
for(i=0;i<len;i++) root=insert_node(root,data[i]); return root; }
二叉树
definition.h ========================================= #define INIT_SIZE 100 //存储空间初始分配量 #define INCREMENT 10 //存储空间分配增量
typedef char TElemType;
typedef struct{ TElemType data; struct BiTNode *lchild, *rchild;//左右孩子指针 }BiTNode, *BiTree;//二叉树的二叉链表存储表示
typedef struct{ BiTree *top, *base; //栈顶指针和栈底指针 unsigned stacksize; //当前已分配的存储空间,以元素为单位 }SqStack;
BiTree CreateBiTree(void);//按先序次序输入二叉树中结点的值,'#'代表空树 void PreOrderTraverse(BiTree);//先序遍历二叉树 int InOrderTraverse(BiTree);//中序遍历二叉树,非递归 int InOrderTraverse2(BiTree); int InitStack(SqStack *);//创建一个空栈 int Push(SqStack *, BiTree); //插入栈顶 ===========================================================================
main.c ================================================ #include <stdio.h> #include "definition.h"
int main() { BiTree bt;
printf("请输入根结点:"); bt = CreateBiTree();//按先序次序创建二叉树 PreOrderTraverse(bt); //先序遍历二叉树 printf("\n"); if( InOrderTraverse(bt) )//中序遍历二叉树,非递归 return 1;//遍历失败,返回 printf("\n"); if( InOrderTraverse2(bt) )//中序遍历二叉树,非递归 return 1;//遍历失败,返回 printf("\n");
return 0; } ===================================================================
function.c ====================================================== #include <stdio.h> #include <malloc.h> #include "definition.h"
BiTree CreateBiTree(void)//按先序次序输入二叉树中结点的值,'#'代表空树 { TElemType e; BiTree tmp = NULL;
if( (e=getchar())!='#' ){ getchar();//接收回车符 tmp=(BiTree)malloc(sizeof(BiTNode)); if(!tmp) return NULL; tmp->data=e; printf("请输入左孩子:"); tmp->lchild=CreateBiTree(); printf("请输入右孩子:"); tmp->rchild=CreateBiTree(); } else getchar();//接收回车符
return tmp; }
void PreOrderTraverse(BiTree bt)//先序遍历二叉树 { if(bt){ printf("%c", bt->data); PreOrderTraverse(bt->lchild); //printf("%c", bt->data);不要上面的printf,而用这个printf,则为中序遍历 PreOrderTraverse(bt->rchild); //printf("%c", bt->data);不要上面的printf,而用这个printf,则为后序遍历 } }
int InOrderTraverse(BiTree bt)//中序遍历二叉树,非递归 { SqStack S; BiTree tmp;
if( InitStack(&S) ) return 1;//如果创建空栈失败,返回1 if( Push(&S, bt) )//根指针进栈 return 1;//如果压栈失败,返回1 while(S.base!=S.top){ while( tmp=*(S.top-1) ){ if( Push(&S, tmp->lchild) )//向左走到尽头 return 1; //printf("%c", tmp->data);//printf放于此处即为先序遍历 } --S.top;//空指针退栈 //访问结点,向右一步 if(S.base!=S.top){ tmp = *(--S.top); printf("%c", tmp->data); if( Push(&S, tmp->rchild) ) return 1; } }
free(S.base); return 0; }
int InOrderTraverse2(BiTree bt) { SqStack S; BiTree tmp = bt;
if( InitStack(&S) ) return 1;//如果创建空栈失败,返回1 while( tmp||(S.base!=S.top) ){ if(tmp){ if( Push(&S, tmp) )//根指针进栈,遍历左子树 return 1; //printf("%c", tmp->data);//printf放于此处即为先序遍历 tmp = tmp->lchild; } //根指针退栈,访问根结点,遍历右子树 else{ tmp = *(--S.top); printf("%c", tmp->data); tmp = tmp->rchild; } }
free(S.base); return 0; }
int InitStack(SqStack *S) //创建一个空栈 { S->base=(BiTree *)malloc( INIT_SIZE * sizeof(BiTree) ); if(!S->base) //空间分配失败 return 1; //空间分配成功 S->top=S->base;//置栈顶指针 S->stacksize=INIT_SIZE;//栈大小 return 0; }
int Push(SqStack *S, BiTree T) //插入栈顶 { if( (unsigned)(S->top - S->base) >= S->stacksize){//栈满,追加存储空间 S->base=(BiTree *)realloc(S->base, (S->stacksize+INCREMENT)*sizeof(BiTree) ); if(!S->base)//分配失败,返回1 return 1; //分配成功 S->top = S->base + S->stacksize;//置栈顶指针 S->stacksize += INCREMENT;//栈大小 } *S->top++ = T;//接收输入后,S->top指向栈顶元素的下一个位置
return 0; }
怎么没有主函数 啊