表达式树的创建与输出

题目要求:(点击图片查看)

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

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

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

来自参考:https://blog.csdn.net/qq_41061455/article/details/80553648

源码与注释:

#include <bits/stdc++.h>
//#include <iostream>
//#include <stdio.h>

using namespace std;
string s;

typedef struct Node{
    int data;
    struct Node* left;
    struct Node* right;
}Node;

void Build(Node* &tree){//建立二叉树
    cin>>s;
    int i=0,sn=0,len=0;
    if(s[0]=='#')   tree=NULL;          //空叶子
    else{                               //节点操作判断
        if(s[0]=='+')   sn=-1;
        else if(s[0]=='-')  sn=-2;
        else if(s[0]=='*')  sn=-3;
        else if(s[0]=='/')  sn=-4;
        else{                           //叶子节点操作数计算
            len=s.size();
            //printf("%d\n",len);       //输出字符串s的长度
            while(i<len){
                sn=sn*10+(s[i]-'0');
                i++;
            }
        }
        tree=new Node;
        tree->data=sn;
        Build(tree->left);          //递归建立左子树
        Build(tree->right);         //递归建立右子树
    }
}

void Print_Tree(Node* tree){        //打印表达式
    if(tree){
        if(tree->data>=0)   printf("%d",tree->data);   //如果遇到叶子节点直接输出
        else{
            printf("(");                                //打印左括号
            Print_Tree(tree->left);                     //打印左子树
            if(tree->data==-1) printf("+");             //打印操作符
            else if(tree->data==-2) printf("-");
            else if(tree->data==-3) printf("*");
            else if(tree->data==-4) printf("/");
            Print_Tree(tree->right);                    //打印右子树
            printf(")");                                //打印右括号
        }
    }
}

int main()
{
    //char ch;
    while(cin>>s)         //输入string字符串,默认空格结束
    {
        //cout<<s;
        int i=0,sn=0,len=0;
        if(s[0]=='+')   sn=-1;          //操作符判断
        else if(s[0]=='-')  sn=-2;
        else if(s[0]=='*')  sn=-3;
        else if(s[0]=='/')  sn=-4;
        else{                           //操作数判断
            len=s.size();
            //printf("%d\n",len);
            while(i<len){
                sn=sn*10+(s[i]-'0');
                i++;
            }
        }
        Node* tree=new Node;
        tree->data=sn;          //叶子节点
        Build(tree->left);      //递归建立左子树
        Build(tree->right);     //递归建立右子树
        Print_Tree(tree);       //打印表达式
        printf("\n");           //输出空行
    }
    return 0;
}

 

posted @ 2018-07-01 23:43  我星伤悲  阅读(2453)  评论(0编辑  收藏  举报