二叉树基本操作递归和非递归方法

#ifndef _BSTREE_H_
#define _BSTREE_H_

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

//二叉树节点类型定义
template<class T>
class BSTreeNode{
public:
	BSTreeNode<T>(const T& data, BSTreeNode<T>* pLeft = NULL, BSTreeNode<T>* pRight = NULL){
		m_Data = data;
		m_pLeft = pLeft;
		m_pRight = pRight;
	}

	T				m_Data;
	BSTreeNode<T>*	m_pLeft;
	BSTreeNode<T>*	m_pRight;
};


//递归算法前序遍历
template<class T>
void PreOrderTraversal(BSTreeNode<T>* pRoot){
	if (pRoot == NULL){
		return;
	}
	cout << pRoot->m_Data << " ";
	PreOrderTraversal(pRoot->m_pLeft);
	PreOrderTraversal(pRoot->m_pRight);
}

//递归算法中序遍历
template<class T>
void InOrderTraversal(BSTreeNode<T>* pRoot){
	if (pRoot == NULL){
		return;
	}
	InOrderTraversal(pRoot->m_pLeft);
	cout << pRoot->m_Data << " ";
	InOrderTraversal(pRoot->m_pRight);
}

//递归算法后续遍历
template<class T>
void PostOrderTraversal(BSTreeNode<T>* pRoot){
	if (pRoot == NULL){
		return;
	}
	PostOrderTraversal(pRoot->m_pLeft);
	PostOrderTraversal(pRoot->m_pRight);
	cout << pRoot->m_Data << " ";
}

//非递归算法前序遍历
template<class T>
void PreOrderTraversal2(BSTreeNode<T>* pNode){
	stack<BSTreeNode<T>*> _stack;

	while (pNode || !_stack.empty()){
		while (pNode){
			_stack.push(pNode);
			cout << pNode->m_Data << " ";
			pNode = pNode->m_pLeft;
		}

		pNode = _stack.top();
		_stack.pop();

		pNode = pNode->m_pRight;
	}
}

//非递归算法中序遍历
template<class T>
void InOrderTraversal2(BSTreeNode<T>* pNode){
	stack<BSTreeNode<T>*> _stack;

	while (pNode || !_stack.empty()){
		while (pNode){
			_stack.push(pNode);
			pNode = pNode->m_pLeft;
		}

		pNode = _stack.top();
		_stack.pop();

		cout << pNode->m_Data << " ";

		pNode = pNode->m_pRight;
	}
}

//非递归算法后序遍历
template<class T>
void PostOrderTraversal2(BSTreeNode<T>* pNode)
{
	stack<BSTreeNode<T>*> _stack;

	if (pNode == NULL){
		return;
	}

	while (1){
		do{
			while (pNode){							//有左儿子进,无左子调用右儿子
				_stack.push(pNode);
				pNode = pNode->m_pLeft;
			}
			pNode = _stack.top()->m_pRight;			//无左子调用右儿子
		} while (pNode != NULL);

		while (1){
			BSTreeNode<T>* pCurr = _stack.top();
			_stack.pop();

			cout << pCurr->m_Data << " ";		//循环表示是从右儿子返回,则继续出栈

			if (_stack.empty())
				break;

			if (pCurr != _stack.top()->m_pRight)
				break;							//否则表明是从左儿子返回
		}
		if (_stack.empty())
			break;

		pNode = _stack.top()->m_pRight;
	}
}

//层序遍历
template<class T>
void LevelOrderTraversal(BSTreeNode<T>* pNode){
	queue<BSTreeNode<T>*> _queue;

	if (pNode){
		_queue.push(pNode);
	}

	while (!_queue.empty())
	{
		pNode = _queue.front();
		_queue.pop();

		cout << pNode->m_Data << " ";

		if (pNode->m_pLeft){
			_queue.push(pNode->m_pLeft);
		}
		if (pNode->m_pRight){
			_queue.push(pNode->m_pRight);
		}
	}
}

//递归算法计算树的高度
template<class T>
int Depth(BSTreeNode<T>* pNode){
	if (pNode == NULL)
		return 0;

	int depth1 = Depth(pNode->m_pLeft);
	int depth2 = Depth(pNode->m_pRight);

	return (depth1 > depth2 ? depth1 : depth2) + 1;
}

//递归算法计算树的节点个数
template<class T>
int NumOfNodes(BSTreeNode<T>* pRoot){
	if (pRoot == NULL)
		return 0;
	int num1 = NumOfNodes(pRoot->m_pLeft);
	int num2 = NumOfNodes(pRoot->m_pRight);
	return num1 + num2 + 1;
}

#endif //~_BSTREE_H_



测试代码:

#include "BSTree.h"

int _tmain(int argc, _TCHAR* argv[])
{
	BSTreeNode<int>* pRoot = new BSTreeNode<int>(10);
	pRoot->m_pLeft = new BSTreeNode<int>(6, new BSTreeNode<int>(4), new BSTreeNode<int>(8));
	pRoot->m_pRight = new BSTreeNode<int>(14, new BSTreeNode<int>(12), new BSTreeNode<int>(16));

	cout << "Depth : " << Depth(pRoot) << endl;
	cout << "NumOfNodes : " << NumOfNodes(pRoot) << endl;

	cout << "-------------------------" << endl;

	PreOrderTraversal<int>(pRoot);
	cout << endl;
	InOrderTraversal<int>(pRoot);
	cout << endl;
	PostOrderTraversal<int>(pRoot);
	cout << endl;

	cout << "-------------------------" << endl;

	PreOrderTraversal2<int>(pRoot);
	cout << endl;
	InOrderTraversal2<int>(pRoot);
	cout << endl;
	PostOrderTraversal2<int>(pRoot);
	cout << endl;

	cout << "-------------------------" << endl;
	LevelOrderTraversal<int>(pRoot);
	cout << endl;
    <span style="font-family: Arial, Helvetica, sans-serif;">	return 0;</span>
}



测试结果:


Depth : 3
NumOfNodes : 7
-------------------------
10 6 4 8 14 12 16
4 6 8 10 12 14 16
4 8 6 12 16 14 10
-------------------------
10 6 4 8 14 12 16
4 6 8 10 12 14 16
4 8 6 12 16 14 10
-------------------------
10 6 14 4 8 12 16



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值