输入一行中缀表达式,转换一颗二叉表达式树,并求解. 表达式只包含+,-,*,/,(,)运算符,操做数只有一位,且为整数(有兴趣同窗能够考虑负数小数,两位数作法)。按照先括号,再乘除,后加减的规则构造二叉树。 如图所示是"1+(2+3)*2-4/5"代数表达式对应二叉树,用对应的二叉树计算表达式的值。 转换二叉树以下:
void InitExpTree(BTree &T, string str) //建表达式的二叉树 创建字符栈op和树根栈node 建立树结点p等于NULL,a,b 定义i=0表示循环变量 定义字符来存判断两符号的优先关系的函数返回的符号 while 表达式str未结束 if str[i] 是数字字符 then 建立树节点p 将结点存入树栈node中 node.push(p) else if str[i]是运算符 then if op.empty() then op.push(str[i]) //若是栈空 则将字符存进去 else f = Precede(op.top(), str[i]) //判断两符号的优先关系 switch f case:'>' 从树栈node出栈两个结点存入a,b中 调用CreateExpTree函数建立数二叉树p并入栈 i-- break case '<':op.push(str[i]); break; //优先级比栈顶元素高 case '=':op.pop(); break; end while while 运算符栈op中不为空且栈node也不为空 从树栈node出栈两个结点存入a,b中 调用CreateExpTree函数建立数二叉树p并入栈 end while double EvaluateExTree(BTree T) 定义浮点数sum,b,m 创建double类型的栈 num表示将每一次计算结果存进去以及取出来 创建字符栈 s表示存入的数据有运算符有数 创建树类型的栈 node表示每次取数的结点 while T 将每一个结点的数据一个个存入s,以及将结点T存入node中 end while while s不为空 if s的栈顶元素为数字 then 将字符转化为数存入num中 else //为运算符时候 sum=num的栈顶元素 num去栈顶元素 b=num的栈顶元素 num去栈顶元素 switch s的栈顶元素 case '+':sum += b; break; case '-':sum -= b; break; case '*':sum *= b; break; case '/': if b等于0 输出divide 0 error!\n 关闭程序 else sum /= b; end if break s.pop(); num.push(sum); 返回sum
二叉树叶子结点的带权路径长度指:叶子结点的权重路径长度。本题要求算出二叉树全部叶子结点的带权路径长度和。 以下面的二叉树:
主要说建树函数和计算权值的函数 BiTree create(string str, int n) 创建新的树节点 BT if str[n] 等于字符# 返回NULL end if if n>str.size() - 1 返回NULL end if BT->data = str[n]; BT->lchild = create(str, 2 * n); //递归建树 BT->rchild= create(str, 2 * n+1); 返回 BT; void GetWPL(BiTree bt,int h,int&wpl) if bt等于NULL 返回 end if if bt左右孩子不空 wpl=wpl+(bt->data-'0')*h; end if GetWPL(bt->lchild,h+1,wpl); GetWPL(bt->rchild,h+1,wpl);
A3:递归口设置的不对,致使最后到了空时候还进行操做致使出错
***node
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
#include<iostream> using namespace std; int in[31], post[31]; typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; BiTree Build(int *in, int *post, int n)//第一个参数是中序序列的起始位置,第二个参数是后序序列的起始位置,n是长度 定义len, *p if n <= 0 then//若是长度小于等于0,直接返回便可 return NULL end if p = in; for pto in+n //少打了一个+n if *p == *(post + n - 1) then break end if enf for 创建新结点T T->data = *p len = p - in; T->lchild = Build(in, post, len); T->rchild = Build(p + 1, post + len, n - len - 1); 返回T void PreOrder(BiTree T) if T不为空 then 输出 T->data; PreOrder(T->lchild); PreOrder(T->rchild); end if return int main() 定义 n, i=0分别表示数组长度和循环变量; BiTree T;//只须要定义,不须要赋值->[BiTree T = new BiTNode;] 输入 n for i to n do 输入 post[i] end for for i to n do 输入 in[i] end for T = Build(in, post, n) 输出"Preorder:" PreOrder(T) return 0
2.再用队列层次输出ios