最近复习数据结构,复习到了树和二叉树部分,将相关的一些操作,如树的定义、初始化、插入节点,和中序遍历、层序遍历,以及计算树的深度等操作依次用c++实现了一遍,后续可能还有其他操作的实现代码,在此记录。
#include <iostream>
#include <queue>
using namespace std;
typedef struct Treenode//定义树节点
{
int data;
struct Treenode* Leftnode;
struct Treenode* Reftnode;
}Tnode,*Tp;
void InitTree(Tp &tree,int data)//初始化空指针
{
tree = new Tnode;
if (tree)
{
tree->Leftnode = nullptr;
tree->Reftnode = nullptr;
tree->data = data;
}
}
void CreateTreeNode(Tp &tree,int data)//创建树节点并递归插入
{
if (tree == nullptr)
InitTree(tree, data);
else
{
if (data < tree->data)
CreateTreeNode(tree->Leftnode,data);
else
CreateTreeNode(tree->Reftnode,data);
}
}
void MiddleVisit(Tp tree)//递归方式的中序遍历
{
if (tree != nullptr)
{
MiddleVisit(tree->Leftnode);
cout << tree->data << " ";
MiddleVisit(tree->Reftnode);
}
}
int CulDepth(Tp tree)//利用递归计算树的深度
{
if (tree == nullptr)
return 0;
else
{
int l = CulDepth(tree->Leftnode);
int r = CulDepth(tree->Reftnode);
return l > r ? l + 1 : r + 1;
}
}
void LayerVisit(Tp tree)//利用队列打印树的层序遍历
{
if (tree == nullptr)
cout << "This is a empty tree" << endl;
queue<Tp> q;
q.push(tree);
while(!q.empty())
{
cout << q.front()->data << " ";
if (q.front()->Leftnode != nullptr)
q.push(q.front()->Leftnode);
if(q.front()->Reftnode != nullptr)
q.push(q.front()->Reftnode);
q.pop();
}
}
int main()
{
Tp tree=nullptr;
int data;
cout << "Please enter the value of the rootnode of the tree:" << endl;
while (cin>>data)
{
cout << "Please enter the value of the current node of the tree:" << endl;
CreateTreeNode(tree,data);
}
cout << "The middle order traversal of this tree results in the following" << endl;
MiddleVisit(tree);
cout << endl;
cout << "The layer traversal of this tree results in the following" << endl;
LayerVisit(tree);
cout << endl;
int deepth = CulDepth(tree);
cout <<"The depth of the tree is:"<< deepth << endl;
delete tree;
tree = nullptr;
return 0;
}