表达式树的创建与输出

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 }

 

以上是关于表达式树的创建与输出的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的建立与遍历 两天之内就要,急用!!!!

二叉排序树的实现

二叉树的前序中序和后续遍历及应用场景

水合没有查询的中继片段

表达式树的说明与运用

建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果