zoukankan      html  css  js  c++  java
  • 表达式树的创建与输出

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

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

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

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

    来自参考: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
    ",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
    ",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("
    ");           //输出空行
        }
        return 0;
    }
  • 相关阅读:
    iPhone之Quartz 2D系列--编程指南(1)概览
    【Lucene3.6.2入门系列】第15节_SolrJ高亮
    项目估算与计划不是一般的难!(6)——如何跟踪计划?
    客户端MapReduce提交到YARN过程
    项目估算与计划不是一般的难!(7)——优秀项目经理是怎样炼成的?
    Properties/Property文件读取(键值均)乱码问题!
    hdu4431 Mahjong 枚举搜索。。
    weblogic 日志介绍
    dp poj 1080 Human Gene Functions
    inter
  • 原文地址:https://www.cnblogs.com/jxxclj/p/9251865.html
Copyright © 2011-2022 走看看