文章目录
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
#define MaxSize 100
typedef struct TreeNode
{
int data;
TreeNode* left;
TreeNode* right;
TreeNode()
{
data = 0; //数据域
left = NULL;
right = NULL;
}
}TreeNode, *TN;
class BinTree
{
public:
BinTree();
TN CreatTree(TN node); //创建二叉树
TN GetRoot();
void PreOrderTraverse1(TN node); //先序递归遍历
void InOrderTraverse1(TN node); //中序递归遍历
void PostOrderTraverse1(TN node); //后序递归遍历
void LevelOrder(TN node); //层次遍历
void Visit(TN node); //输出指定结点的数据
int Depth(TN node); //获得二叉树深度
int NodeCount(TN node); //获得结点个数
int LeafCount(TN node); //获得叶子结点个数
void Destroy(TN node); //销毁二叉树
private:
TreeNode* root;
};
BinTree::BinTree()
{
root = new TreeNode();
root->data = 0;
root->left = NULL;
root->right = NULL;
}
TN BinTree::CreatTree(TN node) //创建二叉树
{
cout << "请输入结点的数据域,当输入为 0 时代表当前位置无结点:";
TN t = node;
int data = 0;
cin >> data;
if(data>0)
{
if(t!=root)
{
t = new TreeNode();
}
t->data = data;
t->left = CreatTree(t->left);
t->right = CreatTree(t->right);
return t;
}
else
{
return NULL;
}
}
TN BinTree::GetRoot()
{
return root;
}
void BinTree::PreOrderTraverse1(TN node) //先序递归遍历
{
if(!node)
{
return;
}
else
{
Visit(node);
PreOrderTraverse1(node->left);
PreOrderTraverse1(node->right);
}
}
void BinTree::InOrderTraverse1(TN node) //中序递归遍历
{
if(!node)
{
return;
}
else
{
InOrderTraverse1(node->left);
Visit(node);
InOrderTraverse1(node->right);
}
}
void BinTree::PostOrderTraverse1(TN node) //后序递归遍历
{
if(!node)
{
return;
}
else
{
PostOrderTraverse1(node->left);
PostOrderTraverse1(node->right);
Visit(node);
}
}
void BinTree::LevelOrder(TN node) //层次遍历
{
if(!node)
{
return;
}
else
{
TN p = node;
queue<TN> q;
q.push(p);
while(!q.empty())
{
p = q.front();
if(p->left)
{
q.push(p->left);
}
if(p->right)
{
q.push(p->right);
}
Visit(q.front());
q.pop();
}
}
}
void BinTree::Visit(TN node) //输出指定结点的数据
{
if(node)
{
cout << node->data << " ";
}
else
{
cout << "结点为空";
}
}
int BinTree::Depth(TN node) //获得二叉树深度
{
if(!node)
{
return 0;
}
else
{
int m = Depth(node->left);
int n = Depth(node->right);
return m>n?(m+1):(n+1);
}
}
int BinTree::NodeCount(TN node) //获得结点个数
{
if(!node)
{
return 0;
}
else
{
return NodeCount(node->left) + NodeCount(node->right) + 1;
}
}
int BinTree::LeafCount(TN node) //获得叶子结点个数
{
if(!node)
{
return 0;
}
else
{
if(node->left==NULL&&node->right==NULL)
{
return 1;
}
else
{
return LeafCount(node->left) + LeafCount(node->right);
}
}
}
void BinTree::Destroy(TN node)
{
if(!node)
{
return;
}
else
{
Destroy(node->left);
Destroy(node->right);
delete node;
}
}
int main()
{
BinTree bt;
bt.CreatTree(bt.GetRoot());
cout << "先序递归遍历:";bt.PreOrderTraverse1(bt.GetRoot());
cout << endl;
cout << "中序递归遍历:";bt.InOrderTraverse1(bt.GetRoot());
cout << endl;
cout << "后序递归遍历:";bt.PostOrderTraverse1(bt.GetRoot());
cout << endl;
cout << "层次遍历:";bt.LevelOrder(bt.GetRoot());
cout << endl;
cout << "深度:" << bt.Depth(bt.GetRoot());
cout << endl;
cout << "结点数:" << bt.NodeCount(bt.GetRoot());
cout << endl;
cout << "叶子结点数:" << bt.LeafCount(bt.GetRoot());
cout << endl;
bt.Destroy(bt.GetRoot());
}
测试结果: