二叉树的遍历 (代码)

来源:互联网 发布:淘宝卖话费怎么没利润 编辑:程序博客网 时间:2024/05/19 00:42
#include<stdio.h>#include<conio.h>#include<ctype.h>#include<malloc.h>#include<string.h>#defineTRUE1#defineFALSE0#defineBEGIN0#define ALPHA1#define LEFT_BRACKET2#define COMMA3#define RIGHT_BRACKET4#define LEFT_CHILD0#define RIGHT_CHILD1typedef struct BTREE{char data;struct BTREE *left;struct BTREE *right;}BTREE;typedef BTREE *USER_TYPE;#include"STACK.H"typedef unsigned char Boolean;BTREE *initBtree(char *str);void recursionFirstRootAccess(BTREE *root);   //先根序序遍历 根节点 左孩子 右孩子void recursionMiddleRootAccess(BTREE *root);void recursionLastRootAccess(BTREE *root);void destroyBtree(BTREE *root);void destroyBtree(BTREE *root){if(root){destroyBtree(root->left);destroyBtree(root->right);free(root);}} void recursionLastRootAccess(BTREE *root){if(root) //根非空才遍历{recursionLastRootAccess(root->left);recursionLastRootAccess(root->right);printf("%c ", root->data);}}void recursionMiddleRootAccess(BTREE *root){if(root) //根非空才遍历{recursionMiddleRootAccess(root->left);printf("%c ", root->data);recursionMiddleRootAccess(root->right);}}void recursionFirstRootAccess(BTREE *root){if(root) //根非空才遍历{printf("%c ", root->data);recursionFirstRootAccess(root->left);recursionFirstRootAccess(root->right);}}BTREE *initBtree(char *str){BTREE *bt = NULL;BTREE *p;BTREE *parent = NULL;int Status = BEGIN;//开始状态int ChildType = LEFT_CHILD;int BracketMatch = 0;//括号匹配int i = 0;Boolean OK = TRUE;STACK *stack;int len;len = strlen(str);stack = initStack(len/2);while(OK && str[i]){if(Status == BEGIN){if(isalpha(str[i])){//这里将产生一个节点,切为内容为str[i],并需要将其放在合适的位置//1、根节点//2、左孩子//3、右孩子//这里一定是根节点p = (BTREE *)malloc(sizeof(BTREE)); //指向树的指针(根节点的首地址)p->data = str[i];p->left = p->right = NULL;bt = p;    //目前p依然指向根节点Status = ALPHA;i++;}elseOK = FALSE;}else if(Status == ALPHA){if(str[i] == '('){//处理"("push(stack, p);BracketMatch++;Status = LEFT_BRACKET;ChildType = LEFT_CHILD;i++;}else if(str[i] == ','){//处理","Status = COMMA;ChildType = RIGHT_CHILD;i++;}else if(str[i] == ')'){BracketMatch--;if(BracketMatch < 0) //括号不匹配OK = FALSE;else{//处理")"pop(stack, &p);Status = RIGHT_BRACKET;i++;}}elseOK = FALSE;}else if(Status == LEFT_BRACKET){if(isalpha(str[i])){//一定是左孩子,应连接到其父节点的左孩子处readTop(*stack, &parent);//////////////////////////////////////////////////p = (BTREE *)malloc(sizeof(BTREE)); //指向树的指针(根节点的首地址)p->data = str[i];p->left = p->left = NULL;parent->left = p;Status = ALPHA;i++;}else if(str[i] == ','){//处理","Status = COMMA;ChildType = RIGHT_CHILD;i++;}else OK = FALSE;}else if(Status == COMMA){if(isalpha(str[i])){//一定是右孩子,应该链接到其父节点的右孩子处//且:此时如果父节点的右孩子指针非空,则表达式出错readTop(*stack, &parent);if(parent->right == NULL){p = (BTREE *)malloc(sizeof(BTREE)); //指向树的指针(根节点的首地址)p->data = str[i];p->left = p->right = NULL;parent->right = p;Status = ALPHA;i++;}elseOK = FALSE;}else if(str[i] == ')'){//处理")"BracketMatch--;if(BracketMatch < 0) //括号不匹配OK = FALSE;else{pop(stack, &p);Status = RIGHT_BRACKET;i++;}}else OK = FALSE;}else if(Status == RIGHT_BRACKET){if(str[i] == ')'){//处理")"BracketMatch--;if(BracketMatch < 0) //括号不匹配OK = FALSE;else{pop(stack, &p);Status = RIGHT_BRACKET;i++;}}else if(str[i] == ','){//处理","Status = COMMA;ChildType = RIGHT_CHILD;i++;}elseOK = FALSE;}elseOK =FALSE;}if(!OK || BracketMatch)OK = FALSE;if(!OK){destroyBtree(bt);printf("错误。%d\n", i );////////////////////////////////////////////释放已经申请的错误的空间}destroyStack(&stack); //只要malloc(),必须要释放空间return bt;}//A(B(D(,G(J,K)), E),C(F(H,I))) void main(void){char str[80];BTREE *tree;printf("请输入二叉树字符串:\n");gets(str);tree = initBtree(str);printf("先根序遍历结果:\n");recursionFirstRootAccess(tree);printf("\n");printf("中根序遍历结果:\n");recursionMiddleRootAccess(tree);printf("\n");printf("后根序遍历结果:\n");recursionLastRootAccess(tree);printf("\n");destroyBtree(tree);getch();}//A(B(D(,G(J,K)),E),C(F(H,I)))//遇到左括号 就把此时指向节点的指针(p = &A)入栈,//遇到右括号出栈

1 0
原创粉丝点击