c++多态实现树

本篇文章为笔者的读书笔记,未经允许请勿转载。如果对你有帮助记得点个赞(●’◡’●)
本文主要利用c++的多态特性来实现树,遍历利用了两种方式,一种是递归,另一种是非递归(栈的实现);
后面会讲到非递归方式的图形式呈现;

源码如下:

stdafx.h

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO:  在此处引用程序需要的其他头文件
#include<vector>
#include<string>
#include<iostream>
#include "baseClass.h"
#include "Tree.h"
#include "treeNode.h"
using namespace std;

main

#include "stdafx.h"
/*
A
 B
  D
  E
 C
  F
*/
void text()
{
	auto a = new TreeNode ("A",0);
	auto b = new TreeNode("B",1);
	auto c = new TreeNode("C",1);

	auto d = new TreeNode("D",2);
	auto e = new TreeNode("E",2);
	
	auto f = new TreeNode("F",2);
	//A里添加bc两个子节点
	a->addChild(b);
	a->addChild(c);

	b->addChild(d);
	//b->removeChild(d);
	b->addChild(e);

	c->addChild(f);
	Tree root(a);
	
	root.recursiveTraverse();//递归遍历
	cout << "---------------------" << endl;
	root.stackTraverse();//非递归遍历
}
int _tmain(int argc, _TCHAR* argv[])
{
	text();
	system("pause");
	return 0;
}

baseClass.h

#pragma once
#include<vector>
#include<string>
using namespace std;//头文件不推荐直接std,这里方便书写。

class NODE//虚基类
{
	//因为是多态实现,所以虚基类不用写成员变量
public:
	//虚析构的执行顺序是先子类后自身
	virtual ~NODE() = default;

	//添加子节点
	virtual void addChild(NODE* node) = 0;
	//移除子节点
	virtual void removeChild(NODE* node) = 0;
	//获取全部子节点,
	virtual vector<NODE*> getChildren() = 0;
	//获取节点名称
	virtual string getName() = 0;
	//获取节点深度
	virtual int getDepth() = 0;
};

TreeNode.h

#pragma once
#include "baseClass.h"
class TreeNode :public NODE
{
	int dep;
	string str;
	vector<NODE*> vec;
public:
	//构造
	TreeNode(string str,int depth) :str(str),dep(depth){}
	//析构
	~TreeNode() = default;

	//继承Node
	virtual void addChild(NODE* node)override;
	virtual void removeChild(NODE* node)override;
	virtual vector<NODE*> getChildren()override;
	virtual string getName()override;
	virtual int getDepth()override;
};

TreeNode.cpp

#include "stdafx.h"
#include "TreeNode.h"
//TreeNode
void TreeNode::addChild(NODE* node)
{
	vec.push_back(node);
}

void TreeNode::removeChild(NODE* node)
{
	auto it = find(vec.begin(), vec.end(), node);
	if (it != vec.end())
	{
		vec.erase(it);
	}
}

std::vector<NODE*> TreeNode::getChildren()
{
	return vec;
}

std::string TreeNode::getName()
{
	return str;
}


int TreeNode::getDepth()
{
	return dep;
}

Tree.h

#pragma once
#include "baseClass.h"
class Tree
{
	NODE* root;
public:
	//构造函数,(多态的实现)
	Tree(NODE* root) :root(root){};
	//析构函数
	~Tree() = default;
	//非递归遍历
	void stackTraverse();
	//递归遍历子树
	void recursiveTraverse();
private:
	//递归遍历
	void _traverse(NODE* node, int depth);
};
};

Tree.cpp

#include "stdafx.h"
#include "Tree.h"
#include<stack>


void Tree::stackTraverse()
{
	stack<NODE*> st;//定义一个栈对象
	st.push(root);//从根节点开始

	//先出后入
	while (!st.empty())//empty为空返回1
	{
		
		NODE* temp = st.top();//获取栈顶元素
		st.pop();//出栈

		for (size_t i = 0; i < temp->getDepth();i++)
		{
			cout << " ";
		}
		cout<<temp->getName()<<endl;//遍历节点名字

		for (auto e : temp->getChildren())//入栈
		{
			if (e != nullptr)
			{
				st.push(e);
			}
		}
	}
}
void Tree::recursiveTraverse()
{
	_traverse(root, 0);
}

void Tree::_traverse(NODE* node, int depth)
{
	//递归返回条件
	if (node == nullptr) return;

	for (size_t i = 0; i < depth;i++)
	{
		cout << " ";
	}
	//输出节点的名称
	cout << node->getName() << endl;

	//递归
	for (auto e : node->getChildren())
	{
		_traverse(e,depth+1);
	}
}

运行结果如下:

A
 B
  D
  E
 C
  F
---------------------
A
 C
  F
 B
  E
  D

非循环遍历详解(栈的实现)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值