二叉树的先序、中序、后序以及层次遍历

树的存储结构

​顺序存储:先将二叉树补成完全二叉树,在从上到下从左到右,将所有节点编号,依次存放在缓冲区中

链式存储:树中每个节点相关结构体

typedef int data_t;
typedef struct tree_node{data_t data;   //  数据域struct tree_node *l_child;   //指向当前节点的左孩子struct tree_node *r_child;   //指向当前节点的右孩子						}T_node;

创建二叉树

T_node *create_tree()  //创建二叉树
{
	char ch;
	scanf("%c", &ch);
	
	T_node *root;
	
	if(ch == '#')
	{
		return NULL;
	}
	else
	{
		root = (T_node *)malloc(sizeof(T_node));
		if(NULL == root)
		{
			printf("malloc failed!\n");
			return NULL;
		}
	
		root->data = ch;
		root->l_child = create_tree();  //递归创建左孩子
		root->r_child = create_tree();  //递归创建右孩子
		
		return root;	
	}	
}

​先序遍历

void Preorder_Traversal(T_node *root)//先序遍历
{
	if(root == NULL)
		return;
	printf("%c",root->data);
	Preorder_Traversal(root->l_child);//访问左孩子
	Preorder_Traversal(root->r_child);//访问右孩子
}

​中序遍历

void Inorder_Traversal(T_node *root)//中序遍历
{
	if(root == NULL)
		return;
	Inorder_Traversal(root->l_child);//访问左孩子
	printf("%c",root->data);
	Inorder_Traversal(root->r_child);//访问右孩子
}

​后序遍历

void l_print(T_node *root) //后序遍历
{
	if(root !=  NULL)
	{	
		l_print(root->l_child);		
		l_print(root->r_child);
		printf("%c", root->data);	
	}	
	return;
}

​二叉树的层次遍历
层次遍历利用队列,通过队列的先进先出的特性,从而将整个树进行层次遍历。

void Level_Traversal(T_node *root)//层次遍历
{
	int rear=1,front=1;
	T_node *buf[32]; //定义一个数组,该数组用于存储树的每个结点的地址
	int i;
	for(i=0;i<32;i++){
		buf[i]=NULL; //将整个数组赋为空值
	}
	if(NULL == root){ //判断是否为空树
		return;
	}
	buf[rear] = root; //将跟结点赋值给数组中第一个元素
	while(buf[front] != NULL){
		printf("%c",buf[front]->data);//打印第一个入对的元素,即跟结点的值
		if(root->l_child != NULL){ //判断该结点下的左孩子结点是否存在,存在则将地址从数组尾部插入
			rear++;//插入一个元素,rear的指向向后移一位
			buf[rear]=root->l_child;//将左孩子地址插入到数组中
		}
		if(root->r_child != NULL){//判断该结点下的右孩子结点是否存在,存在则将地址从数组尾部插入
			rear++;
			buf[rear]=root->r_child;//将左孩子地址插入到数组中
		}
		front++;
		root=buf[front];//此时,front指向第一次插入的跟结点,rear指向数组末尾,接下来要将左孩子结点转变成跟结点,故front++,然后对root赋值
	}
}

函数声明模块

#ifndef _TREE_LINK_H
#define _TREE_LINK_H
typedef char data_t;
typedef struct tree_node
{       
	data_t data;
	struct tree_node *l_child; //定义左孩子结点
	struct tree_node *r_child; //定义右孩子接点
}T_node;
T_node *Create_T_node();//创建树结点
void Preorder_Traversal(T_node *root);//先序遍历
void Inorder_Traversal(T_node *root);//中序遍历
void Postorder_Traversal(T_node *root);//后序遍历
void Level_Traversal(T_node *root);//层次遍历
#endif

主函数模块

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include "tree_link.h"

int main()
{
	T_node *root = Create_T_node();
	Preorder_Traversal(root);//先序遍历
	printf("\n");
	Inorder_Traversal(root);//中序遍历
	printf("\n");
	Postorder_Traversal(root);//后序遍历
	printf("\n");
	Level_Traversal(root);//层次遍历
	printf("\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值