二叉树的遍历 (代码)
来源:互联网 发布:淘宝卖话费怎么没利润 编辑:程序博客网 时间: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
- 二叉树的遍历(代码实现)
- 二叉树的遍历 (代码)
- 二叉树的遍历(代码)
- 二叉树的遍历代码(先序遍历,中序遍历,后序遍历)
- 遍历二叉树代码
- 二叉树的遍历(代码递归和数据递归)
- 二叉树遍历的非递归写法(伪代码)
- 二叉树遍历非递归的代码
- java代码实现二叉树的遍历
- 二叉树的遍历(递归遍历)
- 二叉树的遍历 (二叉树遍历转换)
- 二叉树遍历及代码
- 二叉树遍历(java代码)
- 二叉树遍历C++代码
- 二叉树的遍历(层遍历和深度遍历)
- 由先序遍历和中序遍历构造二叉树的二叉链表代码
- 二叉树的前序遍历,中序遍历,后序遍历代码
- 二叉树的建立、遍历的简单代码
- Debian最小安装+gnome+fcitx输入法调不出来的问题
- cocos2dx-3.x萝莉快跑学习(一)
- ubuntu root 账户登录
- html5+css 一列布局
- Python的优缺点
- 二叉树的遍历 (代码)
- 未定义标识符
- 【记录】独立看门狗
- maya中实时置换效果 dx11shader
- 使用C#(Random)随机数来制作随机字母数字混合密码生成器
- Cisco InterCloud
- YAML 语言教程
- 371. Sum of Two Integers
- java内部类总结