文章目录
- 一、二叉树的前序遍历
- 二、二叉树的中序
- 三、后序
- 四、层序
引言:首先我们讲一下什么是二叉树的前序中序后序层序
前序:从 根 左子树 右子树访问
中序:从 左子树 根 右子树访问
后序:从 左子树 右子树 根访问
等到根为空的时候就无法分解
一、二叉树的前序遍历
首先我们创建几个节点,我这里的树的形状
typedef struct BinaryTreeNode
{
int data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}STNode;
STNode* BuySTNode(int x)
{
STNode* root = (STNode*)malloc(sizeof(STNode));
root->data = x;
root->left = root->right = NULL;
return root;
}
void PreOrder(STNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
else
{
printf("%d ", root->data);
PreOrder(root->left);
PreOrder(root->right);
}
}
int main()
{
STNode* node1 = BuySTNode(1);
STNode* node2 = BuySTNode(2);
STNode* node3 = BuySTNode(3);
STNode* node4 = BuySTNode(4);
STNode* node5 = BuySTNode(5);
STNode* node6 = BuySTNode(6);
node1->left = node2;
node1->right = node4;
node2->right = node5;
node2->left = node3;
node4->left = node6;
PreOrder(node1);
return 0;
}
这里的递归思路:
二、二叉树的中序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct BinaryTreeNode
{
int data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}STNode;
STNode* BuySTNode(int x)
{
STNode* root = (STNode*)malloc(sizeof(STNode));
root->data = x;
root->left = root->right = NULL;
return root;
}
void PreOrder(STNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
else
{
PreOrder(root->left);
printf("%d ", root->data);
PreOrder(root->right);
}
}
int main()
{
STNode* node1 = BuySTNode(1);
STNode* node2 = BuySTNode(2);
STNode* node3 = BuySTNode(3);
STNode* node4 = BuySTNode(4);
STNode* node5 = BuySTNode(5);
STNode* node6 = BuySTNode(6);
node1->left = node2;
node1->right = node4;
node2->right = node5;
node2->left = node3;
node4->left = node6;
PreOrder(node1);
return 0;
}
与前序就把打印根节点放在递归左子树的下面了
也就是一直递归左子树,直到为空树
三、后序
PreOrder(root->left);
PreOrder(root->right);
printf("%d ", root->data);
四、层序
`用队列实现二叉树的层序,将二叉树的节点的指针存在队列中
void LevelOrder(QDataType root)
{
//先创建队列
Queue q;
QueueInit(&q);
//先把根节点指针存到队列中来判断二叉树是否为空
QueuePush(&q, root);
if (QueueEmpty(&q))
return;
while (!QueueEmpty(&q))
{
//创建一个front的指针来接收队头节点指针
STNode* front = QueueFront(&q);
//然后pop掉对头指针
//这里因为指针之间是传递值,pop只是pop掉phead指针,与front指针没有关系
QueuePop(&q);
printf("%d ", front->data);
//按照次序从左子树开始将节点存到队列中
if (front->left)
QueuePush(&q,front->left);
if (front->right)
QueuePush(&q, front->right);
}
QueueDestroy(&q);
}
int main()
{
STNode* node1 = BuySTNode(1);
STNode* node2 = BuySTNode(2);
STNode* node3 = BuySTNode(3);
STNode* node4 = BuySTNode(4);
STNode* node5 = BuySTNode(5);
STNode* node6 = BuySTNode(6);
node1->left = node2;
node1->right = node4;
node2->right = node5;
node2->left = node3;
node4->left = node6;
LevelOrder(node1);
return 0;
}