目录
1.二叉树前置说明
2.前序遍历
2.1函数实现
2.2递归展开图
3.中序遍历
3.1函数实现
3.2递归展开图
4.后序遍历
4.1函数实现
4.2递归展开图
1.二叉树前置说明
在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。因为我们只是为了实现二叉树遍历,所以为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树的排序。
我们创建一个树的结构体,然后实现开辟节点的函数,下面就要链接了(再写一个链接函数,这个函数调用开辟节点函数),开辟好之后就把各自链接起来,大家可以随意链接,我先给大家看看我的树,好方便后面观察递归展开图
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType val;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}TreeNode;//创建一个树的结构体
TreeNode* BuyTreeNode(BTDataType x)//开辟节点
{
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
if (node == NULL)
{
perror("malloc fail");
return;
}
node->val = x;
node->left = NULL;
node->right = NULL;
return node;
}
TreeNode* CreateTree()//调用开辟节点函数,然后把节点链接起来就好了
{
TreeNode* node1 = BuyTreeNode(1);
TreeNode* node2 = BuyTreeNode(2);
TreeNode* node3 = BuyTreeNode(3);
TreeNode* node4 = BuyTreeNode(4);
TreeNode* node5 = BuyTreeNode(5);
TreeNode* node6 = BuyTreeNode(6);
TreeNode* node7 = BuyTreeNode(7);
node1->left = node2;
node1->right = node4;
node2->left = node3;
node4->left = node5;
node4->right = node6;
node5->left = node7;
return node1;
}
int main()
{
TreeNode* root = CreateTree();
return 0;
}
2.前序遍历
2.1函数实现
函数的实现很简单(因为前、中、后序的遍历函数可以说没有什么改变,只是顺序不一样),但是光看函数实现肯定不好理解,所以我们重点就在递归展开图,大家写递归的时候就可以画画图,可以更好理解(因为递归是一层一层的)
void PrevOrder(TreeNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
printf("%d ", root->val);
PrevOrder(root->left);
PrevOrder(root->right);
}
我们遍历的时候最好把NULL也打印出来,这样可以让我们更好的了解前、中、后序 。
2.2递归展开图
前序遍历是:根 左子树 右子树(访问根结点的操作发生在遍历其左右子树之前)
根据我实现的树,前序遍历是:1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL
具体看递归展开图:
(图片太大,只能截出来两种拼在一起,但是不影响阅读) 大概就是递归进去,然后return或者结束返回,因为递归就是一层一层的
(上面的红字就是对应的相对的解释,我没有把4 5 NULL NULL 6 NULL NULL画出来,因为图片太大展示不出来,但是不用担心,因为后面的和前面的递归方法都差不多)
3.中序遍历
3.1函数实现
void InOrder(TreeNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
InOrder(root->left);
printf("%d ", root->val);
InOrder(root->right);
}
3.2递归展开图
中序遍历是:左子树 根 右子树(访问根结点的操作发生在遍历其左右子树之间)
根据我实现的树,前序遍历是:NULL 3 NULL 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL
具体看递归展开图:
4.后序遍历
4.1函数实现
void NextOrder(TreeNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
NextOrder(root->left);
NextOrder(root->right);
printf("%d ", root->val);
}
4.2递归展开图
后序遍历是:左子树 右子树 根(访问根结点的操作发生在遍历其左右子树之后)
根据我实现的树,前序遍历是:NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1
具体看递归展开图:
到这里递归的遍历就结束了,大家如果实在看不懂,可以边看视频边看展开图,这样可以更好理解解