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;
}
输出结果: