表达式的二叉树输入和该二叉树的遍历
2015-11-30 20:38
351 查看
实现功能:
输入一串表达式后,按照中序方式建立二叉树,并对其进行先序和后序的遍历。(输入表达式如此形式:a+b*c-d-e/f….;以#号结束。)程序的基本思想:
输入:输入时直接输入表达式即可。(表达式中所有的符号仅为+,-,*,/,(,),)。输出:输出时将输出二叉树的先序,中序,后序遍历结果。
判定表达式运算的运算符号的先后顺序;用 flag = 0 记作没有扫描到‘(‘,可以扫描括号外的运算符号;扫描括号外的运算符号先后顺序:+,—,大于 * ,/;如果扫描到叶子结点,直接输出,不要判断;如果括号外没有运算符号,脱掉一层括号递归循环运算;一直递归循环扫描,直到叶子结点。
遍历:递归运算遍历。
注:本程序在Linux环境下调试通过。
源代码
#include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #define MAXSIZE 1000 using namespace std; typedef struct bitnode { char data; struct bitnode *lchild; struct bitnode *rchild; }bitnode, *bitree; bitnode* creat (char *str, int s, int l) { //叶子结点 if (l - s == 1) { bitree bit; bit = (bitree) malloc (sizeof(bitnode)); bit -> data = str[s]; bit -> lchild = NULL; bit -> rchild = NULL; return bit; } //寻找最后运算的运算符 int flag = 0, temp1 = 0, temp2 = 0, root = 0; for (int i = s; i < l; i ++) { if (str [i] == '(') flag ++; else if (str [i] == ')') flag --; if (flag == 0) { if (str [i] == '+' || str [i] == '-') temp1 = i; else if (str [i] == '*' || str [i] == '/') temp2 = i; } } //执行循环 if ((temp1 == 0) && (temp2 == 0)) creat (str, s + 1, l - 1); else { if (temp1 > 0) root = temp1; if (temp2 > 0) root = temp2; bitree bitr; bitr = (bitree) malloc (sizeof(bitnode)); bitr -> data = str [root]; bitr -> lchild = creat (str, s, root); bitr -> rchild = creat (str, root + 1, l); return bitr; } } void preordertraverse (bitnode* t) { if (t) { cout << t -> data; preordertraverse (t -> lchild); preordertraverse (t -> rchild); } } void inordertraverse (bitnode* t) { if (t) { inordertraverse (t -> lchild); cout << t -> data; inordertraverse (t -> rchild); } } void postordertraverse (bitnode* t) { if (t) { postordertraverse (t -> rchild); cout << t -> data; postordertraverse (t -> lchild); } } int main () { char str [MAXSIZE]; int l; cout << "输入表达式:" ; cin >> str; l = strlen (str); bitree bit; bit = (bitree) malloc (sizeof(bitnode)); bit = creat (str, 0, l); cout << "先序遍历:" ; preordertraverse (bit); cout << endl; cout << "中序遍历:" ; inordertraverse (bit); cout << endl; cout << "后序遍历:" ; postordertraverse (bit); return 0; }
输出结果:
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- php中使用key,value,current,next和prev函数遍历数组的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- 平衡二叉树
- 二叉树