#include<iostream>
#include<vector>
using namespace std;
//二叉树结点结构
typedef struct BiTNode{
char ch; //结点数据
struct BiTNode *lchild; //左孩子
struct BiTNode *rchild; //右孩子
}BiTNode, *BiTree;
BiTree AddBiTree();//按层遍历创建完全二叉树
void PreOrderTraverse(BiTNode *); //前序遍历
void InOrderTraverse(BiTNode *); //中序遍历
void PostOrderTraverse(BiTNode *); //后序遍历
void LevelOrderTraverse(BiTNode *);//层次遍历
void PreOrderTraverseWithLevel(BiTree T, int level, vector<vector<BiTree>>&);
int main()
{
BiTree root;
root = AddBiTree();
//输出遍历结果
cout << "前序遍历:\n";
PreOrderTraverse(root);
cout << "\n中序遍历:\n";
InOrderTraverse(root);
cout << "\n后序遍历:\n";
PostOrderTraverse(root);
cout << "\n层次遍历:\n";
LevelOrderTraverse(root);
return 0;
}
//按层遍历创建完全二叉树
BiTree AddBiTree()
{
vector<BiTree> trees;
for (int i = 0; ; i++)
{
char c;
cin >> c;
if (c=='#')//c等于回车跳出for循环
{
break;
}
BiTree tree = new BiTNode();
tree->ch = c;//指针为->,对象为.
tree->lchild = NULL;
tree->rchild = NULL;
trees.push_back(tree);
}
for (int i = trees.size()-1;i>0; i--)//从下往上遍历
{
if (i % 2 != 0)//奇数
{
trees[(i - 1) / 2]->lchild = trees[i];
}
else//偶数
{
trees[(i - 1) / 2]->rchild = trees[i];
}
}
return trees[0];//返回根节点
}
//前序遍历
void PreOrderTraverse(BiTree T)
{
if (T){
cout << T->ch << " ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if (T){
InOrderTraverse(T->lchild);
cout << T->ch << " ";
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if (T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->ch << " ";
}
}
//层次遍历
void LevelOrderTraverse(BiTree T){
if (T)
{
vector<vector<BiTree>> vec;
PreOrderTraverseWithLevel(T, 0, vec);
for (int i = 0; i < vec.size(); i++)
{
for (int j = 0; j < vec[i].size(); j++)
{
cout << vec[i][j]->ch << " ";
}
cout << endl;
}
}
}
void PreOrderTraverseWithLevel(BiTree T, int level, vector<vector<BiTree>>& vec)
{
if (T){
if (vec.size()<level+1){
vector<BiTree> arr;
vec.push_back(arr);
}
vec[level].push_back(T);
PreOrderTraverseWithLevel(T->lchild, level + 1, vec);
PreOrderTraverseWithLevel(T->rchild, level + 1, vec);
}
}
c++ 前、中、后、层次遍历完全二叉树
最新推荐文章于 2024-07-25 08:38:10 发布