資料結構與演算法——表示式樹類的C++實現(二叉樹)

readyao發表於2016-04-06

表示式簡介:

表示式樹的樹葉是運算元,如數字或字母,而其它結點為操作符(+ - * / %等);由於這裡的操作都是二元的,所以這棵特定的樹正好是二叉樹。

下面這個樹的中綴表示式為:(a+b*c) + ((d*e + f)*g);(可以中序遍歷該表示式樹獲得該表示式)

這裡寫圖片描述

構造一個表示式樹:將字尾表示式轉為表示式樹

下面是將字尾表示式轉為表示式樹的方法:
首先讀入字尾表示式,從字尾表示式的第一個符號開始進行操作,
如果符合是運算元,就建立一個單結點樹(分配一個結點)並將它的指標推入棧中。
如果符號是操作符,也建立一個單結點樹,並從棧中彈出兩個樹T1,T2。將T1安插在該單結點樹的右孩子上,將T2安插在該單結點樹的左孩子上。最後將該操作符的樹的指標推入棧中。

這裡寫圖片描述

下面是原始碼實現:

/*************************************************************************
    > File Name: BinaryTree.cpp
    > Author: 
    > Mail: 
    > Created Time: 2016年04月06日 星期三 10時24分29秒
 ************************************************************************/

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

#define Type char

struct Node
{
    Type element;
    struct Node * left;
    struct Node * right;
};

class BinaryTree{
    public:
        BinaryTree(struct Node * r = NULL):root(r){}
        BinaryTree(vector<Type> & v);
        ~BinaryTree();
        void inOrderPrint();
    private:
        void deleteNode(struct Node * pNode);
        void init(vector<Type> & v);
        void inOrderPrint(struct Node *node);
    private:
        stack<struct Node*> st;
        struct Node * root;
};


//中序輸出該表示式樹
void BinaryTree::inOrderPrint()
{
    cout << "中序輸出該表示式樹: ";
    inOrderPrint(root); 
    cout << endl;
}
void BinaryTree::inOrderPrint(struct Node* node)
{
    if(node != NULL){
        inOrderPrint(node->left);
        cout << node->element << " ";
        inOrderPrint(node->right);
    } 
}

//建構函式
BinaryTree::BinaryTree(vector<Type> &v)
{
    init(v);
}
//解構函式
BinaryTree::~BinaryTree()
{
    deleteNode(root); 
}

//釋放樹結點記憶體空間
void BinaryTree::deleteNode(struct Node * pNode)
{
    if(pNode != NULL){
        delete pNode;
        deleteNode(pNode->left);
        deleteNode(pNode->right);
    }
}

//初始化樹,將字尾輸出轉換為表示式
void BinaryTree::init(vector<Type> &v)
{
    for(unsigned i = 0; i < v.size(); ++i){
        struct Node * pNode = new Node;
        pNode->element = v[i];
        pNode->left = NULL;
        pNode->right = NULL;

        if((v[i] == '+') || (v[i] == '-') || (v[i] == '*') || (v[i] == '/') || (v[i] == '%')){
            pNode->right = st.top();
            st.pop();
            pNode->left = st.top();
            st.pop();
        }

        st.push(pNode);
    }

    root = st.top();
}


int main()
{
    vector<Type> v;
    Type tmp;

    cout << "輸出表示式的字尾輸出形式: ";
    while(cin >> tmp){
        v.push_back(tmp);
    }

    BinaryTree tree(v);
    tree.inOrderPrint();//中序輸出

    return 0;
}

下面是執行結果:
輸出表示式的字尾輸出形式: a b + c d e + * *
中序輸出該表示式樹: a + b * c * d + e

相關文章