• 构造一棵表达树


    下面给出一种算法把后缀表达式转变成表达树。一次一个符号地读入表达式,如果符号是操作数,那么就建立一个单结点树并将它推入栈中;如果是操作符那么就从栈中弹出两棵树T1和T2并形成一棵新树,该树的根就是操作符,它的左、右儿子分别是T1和T2。然后将指向这课新树的指针压入栈中。

    #ifndef STACK_H
    #define STACK_H

    struct BiTreeNode{
    char data;
    BiTreeNode *left;
    BiTreeNode *right;
    public:
    BiTreeNode(char dat,BiTreeNode *l=0,BiTreeNode *r=0):data(dat),left(l),right(r){}
    ~BiTreeNode();//
    };

    class Stack{
    struct Link{
    BiTreeNode *elem;
    Link *next;
    Link(BiTreeNode *e,Link *nxt):elem(e),next(nxt){}
    ~Link(){}
    }* head;
    public:
    Stack():head(0){}
    ~Stack(){}
    void push(BiTreeNode *e);
    BiTreeNode* peek();
    BiTreeNode* pop();
    void midOrderDisplay(BiTreeNode *BT);
    };

    #endif

    #include "Stack.h"
    #include <iostream>
    using namespace std;
    static int count = 0;
    ////////////////////////////////////
    void Stack::push(BiTreeNode *dat){
    head = new Link(dat,head);
    }
    ////////////////////////////////////
    BiTreeNode* Stack::peek(){
    if(head == 0) return 0;
    return head->elem;
    }
    ////////////////////////////////////
    BiTreeNode* Stack::pop(){
    if(head == 0) return 0;
    BiTreeNode* result = head->elem;
    Link *oldHead = head;
    head = head->next;
    delete oldHead;
    return result;
    }
    ////////////////////////////////////
    //中序遍历
    void Stack::midOrderDisplay(BiTreeNode *BT){
    if(BT){
    midOrderDisplay(BT->left);
    cout << BT->data << " ";
    midOrderDisplay(BT->right);
    }
    }
    ////////////////////////////////////
    int main(){
    Stack sk;
    char dt;
    while(dt != '#'){
    cout << "Please input data: " ;
    cin >> dt;
    cout << endl;
    BiTreeNode *btn = new BiTreeNode(dt,0,0);
    if(dt != '+'&&dt != '-'&&dt != '*'&&dt != '/')
    //if(btn->data != 10000)
    sk.push(btn);
    else{
    BiTreeNode *l,*r;
    l = sk.pop();
    r = sk.pop();
    btn->left = r;
    btn->right = l;
    sk.push(btn);
    }
    }
    sk.pop();
    cout << "Print the Tree :" << endl;
    sk.midOrderDisplay(sk.peek());
    return 0;
    }

  • 相关阅读:
    大数据学习总结(7)we should...
    大数据学习总结(6)what is our foucus
    洛谷P4632 [APIO2018] New Home 新家(动态开节点线段树 二分答案 扫描线 set)
    BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
    BZOJ2438: [中山市选2011]杀人游戏(tarjan)
    cf1072D. Minimum path(BFS)
    cf1072B. Curiosity Has No Limits(枚举)
    cf567E. President and Roads(最短路计数)
    六校联考考试反思
    BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)
  • 原文地址:https://www.cnblogs.com/phoenixzq/p/1895885.html
Copyright © 2020-2023  润新知