数据结构学习笔记10——区分叶结点与分支结点的二叉树实现方案二

上一篇博文实现的二叉树不同,这里讲遍历实现为节点的一个成员函数。


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;
};


需要注意的是,分支结点IntlNode_2的成员函数traverse是用递归实现的,其实现过程中用到了动态绑定的属性。
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;
}

运行结果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值