表达式树的创建与输出
Posted jxxclj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式树的创建与输出相关的知识,希望对你有一定的参考价值。
题目要求:根据前序序列建立表达式数并输出表达式。
这里可以巧妙的使用递归算法解决问题。
这里主要是必须要理清操作符和操作数的关系。所有操作数都为叶子节点,操作符为双亲节点或者根节点。遇到‘#‘符号停止递归。
来自参考:https://blog.csdn.net/qq_41061455/article/details/80553648
源码与注释:
1 #include <bits/stdc++.h> 2 //#include <iostream> 3 //#include <stdio.h> 4 5 using namespace std; 6 string s; 7 8 typedef struct Node{ 9 int data; 10 struct Node* left; 11 struct Node* right; 12 }Node; 13 14 void Build(Node* &tree){//建立二叉树 15 cin>>s; 16 int i=0,sn=0,len=0; 17 if(s[0]==‘#‘) tree=NULL; //空叶子 18 else{ //节点操作判断 19 if(s[0]==‘+‘) sn=-1; 20 else if(s[0]==‘-‘) sn=-2; 21 else if(s[0]==‘*‘) sn=-3; 22 else if(s[0]==‘/‘) sn=-4; 23 else{ //叶子节点操作数计算 24 len=s.size(); 25 //printf("%d ",len); //输出字符串s的长度 26 while(i<len){ 27 sn=sn*10+(s[i]-‘0‘); 28 i++; 29 } 30 } 31 tree=new Node; 32 tree->data=sn; 33 Build(tree->left); //递归建立左子树 34 Build(tree->right); //递归建立右子树 35 } 36 } 37 38 void Print_Tree(Node* tree){ //打印表达式 39 if(tree){ 40 if(tree->data>=0) printf("%d",tree->data); //如果遇到叶子节点直接输出 41 else{ 42 printf("("); //打印左括号 43 Print_Tree(tree->left); //打印左子树 44 if(tree->data==-1) printf("+"); //打印操作符 45 else if(tree->data==-2) printf("-"); 46 else if(tree->data==-3) printf("*"); 47 else if(tree->data==-4) printf("/"); 48 Print_Tree(tree->right); //打印右子树 49 printf(")"); //打印右括号 50 } 51 } 52 } 53 54 int main() 55 { 56 //char ch; 57 while(cin>>s) //输入string字符串,默认空格结束 58 { 59 //cout<<s; 60 int i=0,sn=0,len=0; 61 if(s[0]==‘+‘) sn=-1; //操作符判断 62 else if(s[0]==‘-‘) sn=-2; 63 else if(s[0]==‘*‘) sn=-3; 64 else if(s[0]==‘/‘) sn=-4; 65 else{ //操作数判断 66 len=s.size(); 67 //printf("%d ",len); 68 while(i<len){ 69 sn=sn*10+(s[i]-‘0‘); 70 i++; 71 } 72 } 73 Node* tree=new Node; 74 tree->data=sn; //叶子节点 75 Build(tree->left); //递归建立左子树 76 Build(tree->right); //递归建立右子树 77 Print_Tree(tree); //打印表达式 78 printf(" "); //输出空行 79 } 80 return 0; 81 }
以上是关于表达式树的创建与输出的主要内容,如果未能解决你的问题,请参考以下文章