二叉树之先序遍历

二叉树之先序遍历

在学习二叉树的先序遍历之前,我们首先了解二叉树的由来。
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(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);
	
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值