二叉树的遍历

二叉树的特点:

  1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒。

三种遍历方式

在这里插入图片描述

前序遍历

根 左子树 右子树
1.从A开始 先访问A
2.访问A的左子树 B B既代表A的子节点 同时代表A的左子树 访问B
在访问B时 把B当成根 访问B的左右子树
3.访问B的左子树 D 同样 把D当成根 访问D的左右子树
4.访问D的左子树 为空 返回到D
5.访问D的右子树 为空 返回 D 再返回到 B 此时B的左子树访问结束 下一步访问B的右子树
6.访问B的右子树 E
7.访问E的左子树 为空 返回E
8.访问E的右子树 H
9.访问H的左子树 为空返回
10.访问 H的右子树 为空 返回 E 返回 B 返回A
此时 A的左子树访问完毕 下面开始访问A的右子树
11.访问A的右子树c 把c当成根 下一步访问c的左右子树
12.访问c的左子树f
13.访问f的左子树 为空放回 f
14.访问f的右子树 为空 返回 f 返回c c的左子树访问完毕
15.访问c的右子树 g
16.访问g的左子树为空 返回g
17.访问g的右子树 为空 返回g 返回c 返回A
至此实现了以上二叉树的前序遍历
访问顺序如下 :

A B D E H C F G

中序遍历

左子树 根 右子树
访问顺序如下:
D B E H A F C G

后序遍历

左子树 右子树 根
D H E B F G C A

typedef struct Node
{
	struct Node*left;
	struct Node*right;
	int value;
}Node;
void Preorder(Node*root);
void Inorder(Node*root);
void Afterorder(Node*root);

前序遍历
注意:这里的return 是从 递归的最底层 一层层往上返回的

void Preorder(Node*root)
{
	if (!root)
		return;
	printf("%d ", root->value);
	Preorder(root->left);
	Preorder(root->right); 
}

中序遍历

void Inorder(Node*root)
{
	if (root == NULL)
		return;//这里的return是返回上一层
	Inorder(root->left);
	printf("%d ", root->value);
	Inorder(root->right);
}

后序遍历

void Afterorder(Node*root)
{
	if (root == NULL)
		return;
	Afterorder(root->left);
	Afterorder(root->right);
	printf("%d ", root->value); 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值