通过先序方式创建树,通过简单的递归就可以实现先序,中序,后序遍历。
层次遍历还需要用到队列,当某个节点出队时,它的左右结点要入队(如果有的话)。
#include <iostream>
#include <queue>
using namespace std;
typedef struct Node
{
char data;
struct Node *lchild, *rchild;
}Node;
//通过先序方式创建树,#表示空
/*
A
B C
D E F #
# # # # # #
应输入:ABD##E##CF###
前序遍历:ABDECF
中序遍历:DBEAFC
后序遍历:DEBFCA
层次遍历:ABCDEF
*/
void creatTree(Node* &root)
{
char data;
cin >> data;
if (data == '#')
root = NULL;
else
{
root = new Node;
root->data = data;
creatTree(root->lchild);
creatTree(root->rchild);
}
}
//打印一个节点的数据
void visit(Node* node)
{
if(node != NULL)
cout << node->data;
}
//递归-前序遍历,根左右
void preOrder(Node* root)
{
if (root != NULL)
{
visit(root);
preOrder(root->lchild);
preOrder(root->rchild);
}
}
//递归-中序遍历,左根右
void inOrder(Node* root)
{
if (root != NULL)
{
inOrder(root->lchild);
visit(root);
inOrder(root->rchild);
}
}
//递归-后序遍历,左右根
void postOrder(Node* root)
{
if (root != NULL)
{
postOrder(root->lchild);
postOrder(root->rchild);
visit(root);
}
}
//层次遍历
void layerOrder(Node* root)
{
queue<Node*> q;
q.push(root); //根入队
while (q.empty() == false)
{
//让队伍头元素的左右孩子先入队(如果有的话)
if (q.front()->lchild != NULL)
q.push(q.front()->lchild);
if (q.front()->rchild != NULL)
q.push(q.front()->rchild);
visit(q.front()); //访问头元素并使其出队
q.pop();
}
}
int main()
{
//输入:ABD##E##CF###
Node* root;
creatTree(root);
cout << "前序遍历:";
preOrder(root);
cout << endl << "中序遍历:";
inOrder(root);
cout << endl << "后序遍历:";
postOrder(root);
cout << endl << "层次遍历:";
layerOrder(root);
}
运行结果:
ABD##E##CF###
前序遍历:ABDECF
中序遍历:DBEAFC
后序遍历:DEBFCA
层次遍历:ABCDEF
氷鸢鸢鸢
2020.7.15