C++实现二叉树(非递归)和递归

C++实现二叉树

实现二叉树分两个大部分

第一步实现二叉树的节点类
节点类里面包含三个基本信息
1、节点中的存放的数据
2、节点的左子树节点指针
3、节点的右子树节点指针
下面是实现节点类代码

template <classs T>
class TreeNode{
T data;//数据
TreeNode<T> *LeftChild;//左子树节点指针
TreeNode<T> *RightChild;//右子树节点指针
TreeNode()//构造函数
{
 LeftChild=NULL;
 RightChild=NULL;
}
}

第二部,实现二叉树类
二叉树类包括
1、定义根节点
2、前序遍历函数
3、中序遍历函数
4、后序遍历函数
5、层序遍历函数
6、输出显示函数

template<class T>
class BinaryTree{
public:
          TreeNode<T> * root;//定义根节点
          void preOreder();//前序遍历函数
          void preOrder(TreeNode <T>* currentNode);
          void inOreder();//中序遍历函数
          void inOrder(TreeNode <T>* currentNode);
          void postOreder();//后序遍历函数
          void postOrder(TreeNode <T>* currentNode);
          void display(TreeNode <T>* currentNode);//显示函数
}

下面为各个函数的实现:

//前序遍历
template<class T>
void BinaryTree<T>::preOreder(){
 preOrder(root);
}
template<class T>
void BinaryTree<T>::preOreder(TreeNode <T>* currentNode){

if(currentNode)//判断当前节点是否为空
{
diaplay( currentNode);//显示当前节点数据
preOrder(currentNode->LeftChild);
preOrder(currentNode->RightChild);
}
}
//中序遍历
template<class T>
void BinaryTree<T>::inOrder(){
inOrder(root);
}
 template<class T>
 void BinaryTree<T>::inOrder(TreeNode<T>* currentNode){
if(currentNode)
{
inOrder(currentNode->LeftChild);
diaplay( currentNode);//显示当前节点数据
inOrder(currentNode->RightChild);
}
}
//后序遍历
template<class T>
void BinaryTree<T>::postOrder()
{
postOrder(root);
}
template<class T>
void BinaryTree<T>::postOrder(TreeNode<T>* currentNode){
if(currentNode)
{
postOrder(currentNode->LeftChild);
postOrder(currentNode->RightChild);
diaplay( currentNode);//显示当前节点数据
}
}
//显示函数
template<class T>
void BinaryTree<T>::display(TreeNode<T>* currentNode)
{
cout<<currentNode->data<<endl;
}

到现在二叉树的基本功能都实现了,我们现在需要一颗二叉树来供我们访问,所以在主函数中生成一个二叉树,然后测试一下功能。

int main()
{
	BinaryTree<char> tree;//定义二叉树
	TreeNode<char>,,,, A, B, C, D, E;//定义节点
	//给每个节点赋值,并且定义将每个节点的关系.data = '+';.data = '-';.data = '*';.data = '/';
	A.data = 'A';
	B.data = 'B';
	C.data = 'C';
	D.data = 'D';
	E.data = 'E';
	tree.root = &;.leftChild = &;.rightChild = &E;.leftChild = &;.rightChild = &D;.leftChild = &;.rightChild = &C;.leftChild = &A;.rightChild = &B;
	cout << "中序遍历" << endl;
	tree.InOrder();//中序遍历
	cout << endl;
	cout << "先序遍历" << endl;
	tree.PreOrder();//前序遍历
	cout << endl;
	cout << "后序遍历" << endl;
	tree.PostOrder();//后序遍历
	cout << "层序遍历" << endl;
	tree.LevelOrder();//层序遍历
	system("pause");
	return 0;
	}

下面为完整代码和测试结果:
在 "二叉树.h"中代码为:

#pragma once
#include<iostream>
using namespace std; 
template<class T> class BinaryTree;
template <class T>//表示子节点
class TreeNode
{
public: 
	TreeNode()//无参构造函数,创建对象时只调用一次
	{
		leftChild = NULL;
		rightChild = NULL;
	}
	T data;
	TreeNode<T>  *leftChild;
	TreeNode<T>  *rightChild;



};
template<class T>
class BinaryTree
{
public:
	//二叉树可以进行的操作
	void InOrder();//中序遍历
	void InOrder(TreeNode<T>* currentNode);
	void PreOrder();//前序遍历
	void PreOrder(TreeNode<T>*currentNode);
	void PostOrder();//后序遍历
	void PostOrder(TreeNode<T>*currentNode);
	void LevelOrder();//层序遍历
	void Visit(TreeNode<T>*currentNode);
public:
	TreeNode<T> *root;
	
};

///显示数据
template <class T>
void BinaryTree<T>::Visit(TreeNode<T>*currentNode)
{
	cout << currentNode->data;
}
/*

中序遍历
*/
template <class T>
 void BinaryTree<T>::InOrder()
 {
	 InOrder(root);
 
 }
 template <class T>
 void BinaryTree<T>::InOrder(TreeNode<T>*currentNode)
 {
	 if (currentNode )
	 {
		 InOrder(currentNode->leftChild);
		 Visit(currentNode);
		 InOrder(currentNode->rightChild);
	 
	 
	 }
 }

 /前序遍历
 template <class T>
 void BinaryTree<T>::PreOrder()
 {
	 PreOrder(root);
 }
 template <class T>
 void BinaryTree<T>::PreOrder(TreeNode<T>*currentNode)
 {
	 if(currentNode)
	 {
		 Visit(currentNode);
		 PreOrder(currentNode->leftChild);
		 PreOrder(currentNode->rightChild);
	 }

 }


template <class T>
void BinaryTree<T>::PostOrder()
{
	PostOrder(root);
}
template<class T>
void BinaryTree<T>::PostOrder(TreeNode<T> * currentNode)
{
	if (currentNode) 
	 {
		PostOrder(currentNode->leftChild);
		PostOrder(currentNode->rightChild);
		Visit(currentNode);
	}
}

在“二叉树.cpp”中的代码为:

#include"二叉树.h"
#include<iostream>
using namespace std;
int main()
{
	BinaryTree<char> tree;
	TreeNode<char>,,,, A, B, C, D, E;.data = '+';.data = '-';.data = '*';.data = '/';
	A.data = 'A';
	B.data = 'B';
	C.data = 'C';
	D.data = 'D';
	E.data = 'E';
	tree.root = &;.leftChild = &;.rightChild = &E;.leftChild = &;.rightChild = &D;.leftChild = &;.rightChild = &C;.leftChild = &A;.rightChild = &B;
	
	cout << "中序遍历" << endl;
	tree.InOrder();//中序遍历
	cout << endl;
	cout << "先序遍历" << endl;
	tree.PreOrder();//前序遍历
	cout << endl;
	cout << "后序遍历" << endl;
	tree.PostOrder();//后序遍历
	system("pause");
	return 0;
}

输出结果:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值