与上一篇博文实现的二叉树不同,这里讲遍历实现为节点的一个成员函数。
VarBinNode2.h
/********************************************************/
// 用模板实现二叉树(Binary Node)结点的定义
// 区分叶结点与分支结点,将遍历作为成员函数
/********************************************************/
#pragma once
// 基类
class VarBinNode_2
{
public:
// 因为无数据成员,所以也就没有定义构造函数
virtual ~VarBinNode_2() {};
virtual bool isLeaf() = 0;
virtual void traverse() = 0;
};
//类模板继承普通类
// 叶结点,存储操作数的值
template<typename Operand>
class LeafNode_2 : public VarBinNode_2
{
public:
LeafNode_2(Operand val) : var(val) {}
bool isLeaf() { return true; }
const Operand& value()const { return var; }
void traverse() { cout << var; }
private:
Operand var; //操作数的值
};
// 分支结点,存储操作符和两个子结点的指针
template<typename Operator>
class IntlNode_2 : public VarBinNode_2
{
public:
IntlNode_2(Operator val, VarBinNode_2 *l, VarBinNode_2 *r) : opx(val), left(l), right(r) {}
bool isLeaf() { return false; }
VarBinNode_2* leftchild()const { return left; }
VarBinNode_2* rightchild()const { return right; }
const Operator& value()const { return opx; }
void traverse()//递归的成员函数
{
if (opx == '+' || opx == '-')
{
cout << "(";
}
// 中序遍历 用到了动态绑定的属性,可能调用的是叶结点的traverse,也可能是分支结点的traverse
if (left != NULL) left->traverse();
cout << opx;
if (right != NULL) right->traverse();
if (opx == '+' || opx == '-')
{
cout << ")";
}
}
private:
Operator opx; //操作符的值
VarBinNode_2 *left; //左右子结点,不知道具体类型,所以用的是基类
VarBinNode_2 *right;
};
main.c
/********************************************************/
// 主函数
// 用于测试编写的各函数与数据结构
/********************************************************/
#include "Public.h"
#include "Tools.h"
#include "VarBinNode2.h"
int main()
{
/********************************************************/
// 7.3,叶结点和分支结点分开的二叉树,方案2
/********************************************************/
LeafNode_2<string> NodeA("4");
LeafNode_2<string> NodeB("x");
LeafNode_2<string> NodeC("2");
LeafNode_2<string> NodeD("x");
LeafNode_2<string> NodeE("a");
LeafNode_2<string> NodeF("c");
IntlNode_2<char> NodeG('*', &NodeA, &NodeB);
IntlNode_2<char> NodeH('*', &NodeC, &NodeD);
IntlNode_2<char> NodeI('+', &NodeH, &NodeE);
IntlNode_2<char> NodeJ('*', &NodeG, &NodeI);
IntlNode_2<char> root('-', &NodeJ, &NodeF);
root.traverse();
cout << endl;
system("pause");
return 0;
}
运行结果如下: