C++使用class实现二叉树,及其七种遍历方式

本文介绍了如何使用C++的class构建二叉树,并详细讲解了如何实现包括前序、中序、后序递归遍历,前序、中序、后序迭代遍历以及层序遍历在内的七种遍历方法。虽然作者承认部分思路非原创,但提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部分实现方式有些非原创,参考了他人思路。

使用C++中的类实现了二叉树,并实现了风格统一的三种递归遍历、三种迭代遍历,以及层序遍历。

水平有限,实现比较简化。

//BinaryTree
#include<iostream>
#include<stack>
#include<queue>
using namespace std;

class btNode {
	public:
		double value;
		btNode* left;
		btNode* right;
	public:
		btNode() {
			this->value=0.0;
			this->left=NULL;
			this->right=NULL;
		}
		btNode(double m_value=0.0) {
			this->value=m_value;
			this->left=NULL;
			this->right=NULL;
		}
		~btNode() {
		}
		void setLeft(double m_value) {
			this->left=new btNode(m_value);
//			this->left->value=m_value;
		}
		void setRight(double m_value) {
			this->right=new btNode(m_value);
//			this->right->value=m_value;
		}
//		int printSelf();
		//三种非递归遍历(栈)
		int preGo1();
		int miGo1();
		int postGo1();
		//层序遍历 (队列)
		int levelGo();
		//三种递归遍历
		int preGo2();
		int miGo2();
		int postGo2();
};

int btNode::preGo1() {
	stack<pair<btNode*,bool>> s;
	btNode *p;
	bool visited;
	//false表示此点是第一次进栈 
	s.push(make_pair(this,false));
	while(!s.empty()) {
		p=s.top().first;
		visited=s.top().second;
		s.pop();
		if(p==NULL){
			continue;
		}
		if(visited){
			cout<<"v: "<<p->value<<endl;
		}else{
			s.push(make_pair(p->right,false));
			s.push(make_pair(p->left,false));
			s.push(make_pair(p,true));
		}
	}
	return 0;
}

int btNode::miGo1() {
	stack<pair<btNode*,bool>> s;
	btNode *p;
	bool visited;
	//false表示此点是第一次进栈 
	s.push(make_pair(this,false));
	while(!s.empty()) {
		p=s.top().first;
		visited=s.top().second;
		s.pop();
		if(p==NULL){
			continue;
		}
		if(visited){
			cout<<"v: "<<p->value<<endl;
		}else{
			s.push(make_pair(p->right,false));
			s.push(make_pair(p,true));
			s.push(make_pair(p->left,false));
		}
	}
	return 0;
}

int btNode::postGo1() {
	stack<pair<btNode*,bool>> s;
	btNode *p;
	bool visited;
	//false表示此点是第一次进栈 
	s.push(make_pair(this,false));
	while(!s.empty()) {
		p=s.top().first;
		visited=s.top().second;
		s.pop();
		if(p==NULL){
			continue;
		}
		if(visited){
			cout<<"v: "<<p->value<<endl;
		}else{
			s.push(make_pair(p,true));
			s.push(make_pair(p->right,false));
			s.push(make_pair(p->left,false));
		}
	}
	return 0;
}

int btNode::levelGo(){
	queue<btNode*> q;
	q.push(this);
	btNode* p;
	while(!q.empty()){
		p=q.front();
		q.pop();
		cout<<"v: "<<p->value<<endl;
		if(p->left!=NULL){
			q.push(p->left);
		}
		if(p->right!=NULL){
			q.push(p->right);	
		}
	}
}

int btNode::preGo2() {
	cout<<"v: "<<this->value<<endl;
	if(this->left!=NULL) {
		this->left->preGo2();
	}
	if(this->right!=NULL) {
		this->right->preGo2();
	}
	return 0;
}

int btNode::miGo2() {
	if(this->left!=NULL) {
		this->left->miGo2();
	}
	cout<<"v: "<<this->value<<endl;
	if(this->right!=NULL) {
		this->right->miGo2();
	}
	return 0;
}

int btNode::postGo2() {
	if(this->left!=NULL) {
		this->left->postGo2();
	}
	if(this->right!=NULL) {
		this->right->postGo2();
	}
	cout<<"v: "<<this->value<<endl;
	return 0;
}

int main() {
	double a=0,b=1,c=2,d=3,e=4;
	//    0
	//  1   2
	// 3 4
	btNode *root=new btNode(a);
	root->setLeft(b);
	root->setRight(c);
	root->left->setLeft(d);
	root->left->setRight(e);
	cout<<"迭代式前序遍历:"<<endl;
	root->preGo1();
	cout<<"迭代式中序遍历:"<<endl;
	root->miGo1();
	cout<<"迭代式后序遍历:"<<endl;
	root->postGo1();
	cout<<"---------------------"<<endl;
	cout<<"层序遍历:"<<endl;
	root->levelGo();
	cout<<"---------------------"<<endl;
	cout<<"递归式前序遍历:"<<endl;
	root->preGo2();
	cout<<"递归式中序遍历:"<<endl;
	root->miGo2();
	cout<<"递归式后序遍历:"<<endl;
	root->postGo2();
}

运行效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@wefree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值