数据结构——树的遍历(先序,中序,后序,层次)

通过先序方式创建树,通过简单的递归就可以实现先序,中序,后序遍历。

层次遍历还需要用到队列,当某个节点出队时,它的左右结点要入队(如果有的话)。

#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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值