C++ - 表达式二叉树

这篇博客主要展示了如何使用C++和面向对象思想实现表达式二叉树,内容包括问题描述、解题思路及完整的C++代码。与作者之前的C语言版本相似,但需注意C++版本采用了多文件编程,头文件和源文件需分开存放以避免编译错误。
摘要由CSDN通过智能技术生成

问题描述与解题思路与我之前用C语言写过的博客一模一样,这里这不过是用面向对象的思想以C++语言的方式再次呈现一遍。

C语言版本:点击打开链接

https://blog.csdn.net/y_16041527/article/details/79835727

So......这里直接上C++的完整代码

注意:这里采用多文件编程、不要将BinaryTree.h头文件和ExpTFTree.cpp文件按照前后顺序直接放到一起,会导致编译错误,分开放。

头文件声明:

//BinaryTree.h

#include <iostream>
const int MaxSize = 100;
using namespace std;

//链式二叉树节点的抽象数据类型定义
template <class T>
class BinaryTreeNode
{
public:
	T data;         //数据域
	BinaryTreeNode<T> *left, *right;    //指向二叉树节点的指针

	BinaryTreeNode() {}      //无参构造函数
	BinaryTreeNode(const T d, BinaryTreeNode<T> *l = NULL, BinaryTreeNode<T> *r = NULL)
		:data(d), left(l), right(r) {}            //给定数据域和指针域的构造函数
};

//表达式二叉树的抽象数据类型定义
template <class T>
class ExpTFTree:public BinaryTreeNode<T>
{
public:
	BinaryTreeNode<T> *root;  //二叉树根节点
	T s[MaxSize];          //存储表达式的数组

public:
	ExpTFTree() { root = NULL; }       //构造函数
	~ExpTFTree()         //析构函数
	{
		DeleteExpTFTree(root);
		cout << "释放成功" << endl;
	}   
	void PerCreateTree();  //前缀表达式建树
	void PostCreateTree();  //后缀表达式建树过程
	BinaryTreeNode<T>* InCreateTree(T s[], int i, int j);  //中缀表达式建树过程

	void DispTree(BinaryTreeNode<T> *root);   //凹入表示法输出一棵二叉树
	void PerOrder(BinaryTreeNode<T> *root);  //前序周游给定二叉树
	void InOrder(BinaryTreeNode<T> *root);   //中序周游
	void PostOrder(BinaryTreeNode<T> *root);  //后序周游

	void DeleteExpTFTree(BinaryTreeNode<T> *root);  //删除给定的二叉树
};

Cpp文件

//ExpTFTree.cpp - 表达式二叉树

#include "stdafx.h"
#include "BinaryTree.h"
#include <string.h>
using namespace std;

//ExpTFTree类相关成员函数的实现
//删除给定的二叉树
template <class T>
void ExpTFTree<T>::DeleteExpTFTree(BinaryTreeNode<T> *root)
{
	if (root)
	{
		DeleteExpTFTree(root->left)
前缀表达式和后缀表达式都是一种不含括号的数学表达式,它们可以通过二叉树来表示,这种二叉树就是前缀/后缀表达式二叉树。 前缀表达式二叉树的构建方法是从右往左扫描前缀表达式,将操作数和操作符依次入栈,遇到操作符时从栈中弹出两个操作数作为该操作符的左右子节点,并将新的表达式入栈,直到扫描完整个前缀表达式。 后缀表达式二叉树的构建方法与前缀表达式二叉树类似,只不过是从左往右扫描后缀表达式。 以下是一个实现前缀表达式二叉树C++代码示例: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; // 定义二叉树结构体 struct TreeNode { char val; TreeNode* left; TreeNode* right; TreeNode(char c) : val(c), left(nullptr), right(nullptr) {} }; // 构建前缀表达式二叉树 TreeNode* buildTree(string& s) { stack<TreeNode*> stk; for (int i = s.size() - 1; i >= 0; i--) { char c = s[i]; if (isdigit(c)) { // 操作数入栈 stk.push(new TreeNode(c)); } else { // 操作符出栈,构建新的表达式节点 TreeNode* node = new TreeNode(c); node->left = stk.top(); stk.pop(); node->right = stk.top(); stk.pop(); stk.push(node); } } return stk.top(); } // 前序遍历输出二叉树 void preOrder(TreeNode* root) { if (root == nullptr) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right); } int main() { string s = "+*1234"; TreeNode* root = buildTree(s); preOrder(root); // 输出:+ * 1 2 3 4 return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值