【算法导论】二叉树的深度优先遍历

简介: 二叉树的深度优先遍历 二叉树的遍历可以分为深度优先遍历和广度优先遍历。本篇介绍深度优先遍历,下一篇介绍广度优先遍历。         根据二叉树的递归定义可知,二叉树是由根结点(D)、左子树(L)和右子树(R)三个基本部分组成。

二叉树的深度优先遍历

二叉树的遍历可以分为深度优先遍历和广度优先遍历。本篇介绍深度优先遍历,下一篇介绍广度优先遍历。
        根据二叉树的递归定义可知,二叉树是由根结点(D)、左子树(L)和右子树(R)三个基本部分组成。只要能依次遍历这三个基本部分,便可遍历整个二叉树。这三个部分的排列组合为3!=6种,若限定按照先左后右进行遍历,则只有三种遍历方式:DLR(先序)、LDR(中序)、LRD(后序)。
具体实现如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define maxsize 10
typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *lchild,*rchild;
} bitree;//二叉树的节点结构

bitree* CreatBitree(int* arrayA,int n);//创建二叉树(以顺序存储方式)
void preorder(bitree *p);//先序遍历算法
void midorder(bitree *p);//中序遍历算法
void postorder(bitree *p);//后序遍历算法

void main()
{
	int arrayA[9]={0,1,2,3,4,5,6,7,8};//第一个节点没有用于存储数据,是为了方便计算
	int n=sizeof(arrayA)/sizeof(int);

	bitree *head=NULL;//初始化指向链表的头指针

	head=CreatBitree(arrayA,n);//建立链表

	printf("前序遍历:");
	preorder(head);
	printf("\n中序遍历:");
	midorder(head);
	printf("\n后序遍历:");
	postorder(head);
	printf("\n");
}

bitree* CreatBitree(int* arrayA,int n)//顺序存储 建立二叉树
{
	bitree *root;
	bitree *queue[maxsize];//队列用于保存已输入节点的地址
	bitree *p;
	int front,rear;
	front=1;rear=0;//指向队列的头尾
	root=NULL;

	for(int i=1;i<n;i++)
	{
		p=(bitree*)malloc(sizeof(bitree));//创立节点并赋值
		p->data=arrayA[i];
		p->lchild=NULL;
		p->rchild=NULL;

		rear++;
		queue[rear]=p;

		if(rear==1)//判断是否为输入的第一个节点
			root=p;
		else
		{
			if(i%2==0)//新节点为左孩子
				queue[front]->lchild=p;
			else//新节点为右孩子
			{
				queue[front]->rchild=p;
				front=front+1;
			}
		}

	}

	return root;
}

void preorder(bitree *p)//前序遍历
{
	if(p!=NULL)
	{
		printf("%d ",p->data);
		preorder(p->lchild);
		preorder(p->rchild);
	}
	return;
}

void midorder(bitree *p)//中序遍历
{
	if(p!=NULL)
	{
		
		midorder(p->lchild);
		printf("%d ",p->data);
		midorder(p->rchild);
	}
	return;
}

void postorder(bitree *p)//后序遍历
{
	if(p!=NULL)
	{
		postorder(p->lchild);
		postorder(p->rchild);
		printf("%d ",p->data);
	}
	return;
}
注:如果程序出错,请点击如下链接:  解释说明


目录
相关文章
|
20天前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
14 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
20天前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
15 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
24天前
|
存储 算法
【二叉树】—— 算法题
【二叉树】—— 算法题
【二叉树】—— 算法题
|
20天前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
16 0
|
2月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
71 12
|
3月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
23 0
|
3月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
75 0
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
38 0
|
4月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
36 1
|
4月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
65 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)