我们来了解一下二叉树的遍历,话不多说
二叉树的遍历的概念:
二叉树有四种遍历方式,分别为前序遍历,中序遍历,后序遍历和层序遍历,但我们今天谈谈前三种,并实现它
前序遍历: 按照根,左子树,右子树的顺序进行遍历,方便记忆:根左右
中序遍历: 按照左子树,根,右子树的顺序进行遍历,方便记忆:左根右
后序遍历: 按照左子树,右子树,根的顺序进行遍历,方便记忆:左右根
注意:对于左右子树,是相对于每个根结点来说的,遍历时必须直到最后为空时,再往上返回
看了概念依然会有很多人不解(包括我),所以我们接下来来用中序遍历的例子帮助我们更好地理解
根据中序遍历的左根右的顺序,和上图的方向,我们可以写出中序遍历的顺序结构形式了:
递归代码实现:
创建二叉树:
我们定义数据域和指针域,指针域为树的左右结点
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data;//数据域
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
前中后序遍历:
我们通过中序遍历发现当它往下调用完之后会往上返回,这符合递归的调用的方式
//前序遍历--根左右
void PreOrder(BTNode* root)
{
if (root == NULL)//递归函数的出口
{
printf("NULL ");
return;
}
printf("%d ", root->data);
PreOrder(root->left);
PreOrder(root->right);
}
//中序遍历--左根右
void MidOrder(BTNode* root)
{
if (root == NULL)//递归函数的出口
{
printf("NULL ");
return;
}
MidOrder(root->left);
printf("%d ", root->data);
MidOrder(root->right);
}
//后序遍历--左右根
void AftOrder(BTNode* root)
{
if (root == NULL)//递归函数的出口
{
printf("NULL ");
return;
}
AftOrder(root->left);
AftOrder(root->right);
printf("%d ", root->data);
}