二叉树之先序遍历
在学习二叉树的先序遍历之前,我们首先了解二叉树的由来。
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树是数据结构中的一种数据存储方式。
数据结构:研究虚拟内存中数据的存储关系,逻辑关系,运算关系。
二叉树的构建
二叉树的遍历分为以下三种:
先序遍历:遍历顺序规则为【根左右】
中序遍历:遍历顺序规则为【左根右】
后序遍历:遍历顺序规则为【左右根】
1、二叉树结点的定义:
//设计树的节点
struct node
{
int data; //数据域
struct node *left; //左 -》 小
struct node *right; //右 -》 大
};
2、二叉树插入结点的函数:
struct node *inser_node(struct node *root, int data)
{
//假设节点为 NULL 则直接退出
if(root == NULL)
{
return NULL;
}
//比较插入的数据 是否比 根大 -》 看看右边是否为 NUll
if(data > root->data && root->right == NULL) //直接插入
{
struct node *new = malloc(sizeof(struct node ));
new->data = data;
new->right = NULL;
new->left = NULL;
root->right = new;
return new;
}
else if(data > root->data && root->right != NULL) //递归下去直到根节点为NULL
{
inser_node(root->right, data);
}
//比较插入的数据是否比根小 -》 看看左边是否为 NULL
if(data <= root->data && root->left == NULL)
{
struct node *new = malloc(sizeof(struct node ));
new->data = data;
new->right= NULL;
new->left= NULL;
root->left = new;
return new;
}
else if(data <= root->data && root->left != NULL)
{
inser_node(root->left,data);
}
}
3、二叉树的先序遍历:
//遍历数的方式,根据访问根节点的 顺序去确定
/*
先序遍历 -》 根 -》 左 -》 右
中序遍历 -》 左 -》 根 -》 右
后序遍历 -》 左 -》 右 -》 根
*/
void show(struct node *root)
{
if(root == NULL)
{
return ;
}
printf("%d\n",root->data); //先访问 根
show(root->left); //再访问左
show(root->right); //最后访问 右 -> 先序遍历
}
4、二叉树先序遍历的完整代码:
#include <stdio.h>
#include <stdlib.h>
//设计树的节点
struct node
{
int data; //数据域
struct node *left; //左 -》 小
struct node *right; //右 -》 大
};
struct node *inser_node(struct node *root,int data)
{
//假设节点为 NULL 则直接退出
if(root == NULL)
{
return NULL;
}
//比较插入的数据 是否比 根大 -》 看看右边是否为 NUleftleft
if(data > root->data && root->right == NULL) //直接插入
{
struct node *new = malloc(sizeof(struct node ));
new->data = data;
new->right= NULL;
new->left= NULL;
root->right = new;
return new;
}
else if(data > root->data && root->right != NULL) //递归下去直到根节点为NULL
{
inser_node(root->right,data);
}
//比较插入的数据 是否比 根小 -》 看看左边是否为 NULL
if(data <= root->data && root->left == NULL)
{
struct node *new = malloc(sizeof(struct node ));
new->data = data;
new->right= NULL;
new->left= NULL;
root->left = new;
return new;
}
else if(data <= root->data && root->left != NULL)
{
inser_node(root->left,data);
}
}
//遍历数的方式
/*
先序遍历 -》 根 -》 左 -》 右
中序遍历 -》 左 -》 根 -》 右
后序遍历 -》 左 -》 右 -》 根 //根据访问根节点的 顺序去确定
*/
void show(struct node *root)
{
if(root == NULL)
{
return ;
}
printf("%d\n",root->data); //先访问 根
show(root->left); //再访问左
show(root->right); //最后访问 右 -> 先序遍历
}
int main()
{
//创建一个根节点
struct node *root = malloc(sizeof(struct node ));
root->data = 10;
root->right= NULL;
root->left= NULL;
//插入节点
inser_node(root,12);
inser_node(root,3);
inser_node(root,20);
inser_node(root,23);
inser_node(root,9);
show(root);
}