码迷,mamicode.com
首页 > 其他好文 > 详细

表达式树的创建与输出

时间:2018-07-02 01:18:29      阅读:452      评论:0      收藏:0      [点我收藏+]

标签:括号   图片   blog   str   问题   https   sdn   net   IV   

技术分享图片

题目要求:根据前序序列建立表达式数并输出表达式。

这里可以巧妙的使用递归算法解决问题。

这里主要是必须要理清操作符和操作数的关系。所有操作数都为叶子节点,操作符为双亲节点或者根节点。遇到‘#‘符号停止递归。

来自参考: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\n",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\n",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("\n");           //输出空行
79     }
80     return 0;
81 }

 

表达式树的创建与输出

标签:括号   图片   blog   str   问题   https   sdn   net   IV   

原文地址:https://www.cnblogs.com/jxxclj/p/9251865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!