二叉树的遍历算法

 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有节点,使每一个节点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个节点转换成为一个线性序列来表示。

                ​​​​​​​      

                          ​​​​​​​        

二叉树常用的遍历方式有:前序遍历、中序遍历、后序遍历、层序遍历四种遍历方式,不同的遍历算法,其思想略有不同,我们来看一下这四种遍历方法主要的算法思想:

1、先序遍历二叉树顺序:根节点 –> 左子树 –> 右子树,即先访问根节点,然后是左子树,最后是右子树。
上图中二叉树的前序遍历结果为:0 -> 1 -> 3 -> 4 -> 2 -> 5 -> 6 

 

2、中序遍历二叉树顺序:左子树 –> 根节点 –> 右子树,即先访问左子树,然后是根节点,最后是右子树。
上图中二叉树的中序遍历结果为:3 -> 1 -> 4 -> 0 -> 5 -> 2 -> 6

 

3、后续遍历二叉树顺序:左子树 –> 右子树 –> 根节点,即先访问左子树,然后是右子树,最后是根节点。
上图中二叉树的后序遍历结果为:3 -> 4 -> 1 -> 5 -> 6 -> 2 -> 0

 

4、层序遍历二叉树顺序:从上往下,从左往右,一层一层遍历,直到所有节点都遍历完成。
上图中二叉树的层序遍历结果为:0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6

 

代码示例:


typedef struct _Node
{
	int data;
	_Node* lchild;
	_Node* rchild;
	_Node()
	{
		data = -1;
	}
}Node, *pNode;

//前序遍历
void PreOrderParse(Node* node)
{
	if (node == NULL)
		return;

	cout << node->data;
	PreOrderParse(node->lchild);
	PreOrderParse(node->rchild);
}

//中序遍历
void InOrderParse(Node* node)
{
	if (node == NULL)
		return;

	PreOrderParse(node->lchild);
	cout << node->data;
	PreOrderParse(node->rchild);
}

//后序遍历
void PastOrderParse(Node* node)
{
	if (node == NULL)
		return;

	PreOrderParse(node->lchild);
	PreOrderParse(node->rchild);
	cout << node->data;
}

//层序遍历
void SequenceParse(queue<Node*> que)
{
	while (!que.empty()) 
	{
		// 得到队头元素并且将队头元素出队列
		Node* node = que.front();
		que.pop();  
		// 如果当前节点不为空,那么输出该节点,并且将该节点的左右子节点插入队尾 
		if (node != NULL)
		{
			cout << node->data << endl;
			que.push(node->lchild);
			que.push(node->rchild);
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值