資料結構與演算法——表示式樹類的C++實現(二叉樹)
表示式簡介:
表示式樹的樹葉是運算元,如數字或字母,而其它結點為操作符(+ - * / %等);由於這裡的操作都是二元的,所以這棵特定的樹正好是二叉樹。
下面這個樹的中綴表示式為:(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
相關文章
- 資料結構與演算法-表示式二叉樹資料結構演算法二叉樹
- 資料結構與演算法——二叉查詢樹類的C++實現資料結構演算法C++
- 資料結構與演算法——AVL樹類的C++實現資料結構演算法C++
- 資料結構與演算法——B樹的C++實現資料結構演算法C++
- 【資料結構與演算法】二叉樹資料結構演算法二叉樹
- 【資料結構】二叉樹(c++)資料結構二叉樹C++
- 資料結構與演算法——普通樹的定義與C++實現資料結構演算法C++
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- 資料結構與演算法:二叉排序樹資料結構演算法排序
- javascript資料結構與演算法-- 二叉樹JavaScript資料結構演算法二叉樹
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 資料結構-二叉搜尋樹的實現資料結構
- 【演算法與資料結構 02】二叉樹的引入演算法資料結構二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 資料結構與演算法-kd二叉樹(kNN)資料結構演算法二叉樹KNN
- 資料結構與演算法-二叉樹性質資料結構演算法二叉樹
- 資料結構與演算法-二叉樹遍歷資料結構演算法二叉樹
- 資料結構與演算法-二叉查詢樹資料結構演算法
- python資料結構之二叉樹的實現Python資料結構二叉樹
- java實現-資料結構之二叉樹(三):線索化二叉樹Java資料結構二叉樹
- 資料結構和演算法-Go實現二叉搜尋樹資料結構演算法Go
- 結構與演算法(05):二叉樹與多叉樹演算法二叉樹
- 【資料結構與演算法】二叉排序樹C實現(含完整原始碼)資料結構演算法排序原始碼
- 資料結構 其五 樹與二叉樹學習總結資料結構二叉樹
- 資料結構和演算法-二叉樹,AVL,紅黑樹資料結構演算法二叉樹
- 資料結構和演算法:二叉樹資料結構演算法二叉樹
- 資料結構-二叉樹資料結構二叉樹
- 資料結構 - 二叉樹資料結構二叉樹
- 【資料結構】二叉樹!!!資料結構二叉樹
- 『資料結構與演算法』二叉查詢樹(BST)資料結構演算法
- 資料結構與演算法-kd二叉樹(基礎)資料結構演算法二叉樹
- 【資料結構與演算法】手撕平衡二叉樹資料結構演算法二叉樹
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 二叉樹的子樹和子結構 c++二叉樹C++
- 資料結構學習(c++)——二叉樹 (轉)資料結構C++二叉樹
- 資料結構的故事之二叉樹, 字首樹, N叉樹資料結構二叉樹
- 資料結構之二叉搜尋樹—Java實現資料結構Java