Article Directory
#include<iostream>
#include<stack>
#include<queue>
#include<string.h>
using namespace std;
#define MaxSize 101
class BinTree
{
public:
BinTree();
void CreatTree(); //生成二叉树
void PreOrderTraverse1(int i=1); //先序递归遍历
void InOrderTraverse1(int i=1); //中序递归遍历
void PostOrderTraverse1(int i=1); //后序递归遍历
void LevelOrder(); //层次遍历
void Visit(int i); //输出第i个位置的数据
int Depth(int i=1); //获得二叉树深度
int NodeCount(int i=1); //获得结点个数
int LeafCount(int i=1); //获得叶子结点个数
~BinTree();
private:
int* list; //结点存储的数据为整形数
int size; //记录结点的个数
};
BinTree::BinTree()
{
list = new int[MaxSize];
memset(list,0,MaxSize);
}
void BinTree::CreatTree() //生成二叉树
{
int n = 0;
cout << "请输入结点个数:";
cin >> n;
if(n<=0)
{
cout << "结点数不能小于1" << endl;
return;
}
while(n>MaxSize)
{
cout << "最大结点数为:" << MaxSize << endl;
cout << "请输入结点个数:";
cin >> n;
}
size = n;
cout << "请输入每个结点的数据:";
for(int i=0; i<n; ++i)
{
cin >> list[i];
}
}
void BinTree::PreOrderTraverse1(int i) //先序递归遍历
{
if(!size)
{
return;
}
else
{
if(list[i-1]!=0)
{
Visit(i);
PreOrderTraverse1(2*i);
PreOrderTraverse1(2*i+1);
}
else
{
return;
}
}
}
void BinTree::InOrderTraverse1(int i) //中序递归遍历
{
if(!size)
{
return;
}
else
{
if(list[i-1]!=0)
{
InOrderTraverse1(2*i);
Visit(i);
InOrderTraverse1(2*i+1);
}
else
{
return;
}
}
}
void BinTree::PostOrderTraverse1(int i) //后序递归遍历
{
if(!size)
{
return;
}
else
{
if(list[i-1]!=0)
{
PostOrderTraverse1(2*i);
PostOrderTraverse1(2*i+1);
Visit(i);
}
else
{
return;
}
}
}
void BinTree::LevelOrder() //层次遍历
{
if(!size)
{
return;
}
else
{
queue<int> q;
int i = 1;
q.push(i);
while(!q.empty())
{
if(list[q.front()-1]!=0) //如果队头结点的数据域不为0,说明该结点在二叉树中
{
i = q.front();
q.push(2*i);
q.push(2*i+1); //将队头结点的左右结点入队
Visit(i);
q.pop();
}
else
{
q.pop();
}
}
}
}
void BinTree::Visit(int i) //输出第i个位置的数据
{
if(list[i-1]!=0)
{
cout << list[i-1] << " ";
}
}
int BinTree::Depth(int i) //获得二叉树深度
{
if(!size)
{
return 0;
}
else
{
if(list[i-1]==0)
{
return 0;
}
else
{
int m = Depth(2*i);
int n = Depth(2*i+1);
return m>n?(m+1):(n+1);
}
}
}
int BinTree::NodeCount(int i) //获得结点个数
{
if(!size)
{
return 0;
}
else
{
if(list[i-1]==0)
{
return 0;
}
else
{
return NodeCount(2*i) + NodeCount(2*i+1) + 1; //返回左子树的结点个数+右子树的结点个数+1
}
}
}
int BinTree::LeafCount(int i) //获得叶子结点个数
{
if(!size)
{
return 0;
}
else
{
if(list[2*i-1]==0&&list[2*i]==0)
{
return 1;
}
else
{
if(list[2*i-1]!=0&&list[2*i]==0)
{
return LeafCount(2*i);
}
else if(list[2*i]!=0&&list[2*i-1]==0)
{
return LeafCount(2*i+1);
}
else
{
return LeafCount(2*i) + LeafCount(2*i+1);
}
}
}
}
BinTree::~BinTree()
{
delete[] list;
}
int main()
{
BinTree bt;
bt.CreatTree();
cout << "先序递归遍历:";bt.PreOrderTraverse1();
cout << endl;
cout << "中序递归遍历:";bt.InOrderTraverse1();
cout << endl;
cout << "后序递归遍历:";bt.PostOrderTraverse1();
cout << endl;
cout << "层次遍历:";bt.LevelOrder();
cout << endl;
cout << "深度:" << bt.Depth();
cout << endl;
cout << "叶子结点数:" << bt.LeafCount();
cout << endl;
cout << "结点数:" << bt.NodeCount();
cout << endl;
}
Test Results: