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

二叉树的深度优先遍历

二叉树的遍历可以分为深度优先遍历和广度优先遍历。本篇介绍深度优先遍历,下一篇介绍广度优先遍历。

        根据二叉树的递归定义可知,二叉树是由根结点(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;
}

注:如果程序出错,请点击如下链接: 解释说明

原文:http://blog.csdn.net/tengweitw/article/details/9787223

作者:nineheadedbird

时间: 2024-08-20 02:32:56

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

算法-有关图的深度优先遍历问题的学习

问题描述 有关图的深度优先遍历问题的学习 请问,如何学习掌握深搜算法,求推荐例题,经典题目,为了参加ACM 解决方案 http://blog.csdn.net/u014271612/article/details/47705289 可以看一下思想! 解决方案二: 图的深度优先遍历图的深度优先遍历图深度优先遍历 解决方案三: www.codevs.cn 题库->搜索->深度优先搜索

二叉树的层序遍历概述

前面有篇博客详细分析了二叉树三种遍历(前序.中序.后序)方式的递归与非递归实现,参见:http://blog.csdn.net/ns_code/article/details/12977901,但把二叉树的层序遍历算法给漏掉了,实际上也不能说漏掉了,毕竟层序遍历的实现方法与这三种遍历的实现方法有所不同,因此单独拿出来分析比较合适. 二叉树的层序遍历的实现还是比较简单的,由于其层级的关系,很明显要用到队列来辅助实现,主要是从左向右,自上而下,依次将二叉树的各节点入队,这样便可以保证输出的顺序是层序

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

二叉树的广度优先遍历 广度优先遍历:又称按层次遍历,也就是先遍历二叉树的第一层节点,然后遍历第二层节点--最后遍历最下层节点.而对每一层的遍历是按照从左至右的方式进行的. 基本思想:按照广度优先遍历的方式,上一层中先被访问的节点,它的下层孩子也必然先被访问,因此在算法实现时,需要使用一个队列.在遍历进行之前先把二叉树的根结点的存储地址入队,然后依次从队列中出队结点的存储地址,每出队一个结点的存储地址则对该结点进行访问,然后依次将该结点的左孩子和右孩子的存储地址入队,如此反复,直到队空为止. 具体

图的深度优先遍历算法

前言 图的遍历与前面文章中的二叉树遍历还是存在很大区别的.所谓图的遍历指的是从图中的某一个顶点出发访问图中的其余顶点,并且需要保证每个顶点只被访问一次.由于图比二叉树复杂得多,所以前面二叉树的遍历算法在图中是行不通的.因为对于任意一个顶点来讲,都可能与其余的顶点发生连接.如果不对访问的顶点做一些处理,出发重复访问的几率是很高的.因此,一个基本思想是设置一个标记数组,主要用于标记已经被访问过的顶点.图的遍历算法主要有两种:深度优先遍历和广度优先遍历.本篇文章主要介绍的是深度优先遍历算法. 深度优先

某研究院的二叉树深度优先遍历变种的算法面试题以及答案

  去了某研究院面试,被面了一道算法题,觉得有点意思,所以写下来供后人参考. 题目是这样子的: 给定二叉树,二叉树的每个节点都是一个整数值,求从叶子节点到根节点的和为某数的所有路径 例如下图中,要求叶子节点到根节点的值和为14的路径为: 3,6,53,7,4 这道题考的是二叉树深度优先遍历的增强版,其实现代码如下: package cn.outofmemory; import java.util.Stack; public class TreeSum { public static void m

二叉树创建及遍历算法

//二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二叉树的前,中,后序遍历(递归) 时间:2001年10月7日(21:09:38-22:09:00) 内容:完成二叉树的前,中序遍历(非递归) 时间:2001年10月8日(10:09:38-11:29:00) 内容:完成查找二叉树的静,动态查找(非递归) */ #include "stdlib.h&qu

算法研究:图的深度优先遍历

图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程 就叫做图的遍历(Traverse Graph). 图的遍历方法一般有两种,第一种是深度优先遍历(Depth First Search),也 有称为深度优先搜索,简称为DFS.第二种是<广度优先遍历(Breadth  First Search)>,也有称为广度优先搜索, 简称为BFS.我们在<堆栈与深度优先搜索>中已经较为详细地讲述了深度优先搜索的策略,这里不再赘述.我们也可以把

已知一颗满二叉树可以用线性表1 2 3 4 5 6 7 8 9 10 11表示,求出深度优先遍历序列

问题描述 已知一颗满二叉树可以用线性表1 2 3 4 5 6 7 8 9 10 11表示,求出深度优先遍历序列 已知一颗满二叉树可以用线性表1 2 3 4 5 6 7 8 9 10 11表示,求出深度优先遍历序列 解决方案 1 2 4 8 9 5 10 11 3 6 7

数据结构算法-农夫过河问题用深度优先遍历和广度优先遍历?

问题描述 农夫过河问题用深度优先遍历和广度优先遍历? 农夫过河问题用深度优先遍历和广度优先遍历的区别?用哪个更好? 解决方案 求解这个问题的最简单的方法是一步一步进行试探,每一步都搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案. 用计算机实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先(breadth_first) 搜索,另一种是深度优先(depth_first) . 广度优先: u 广度优先的含义就是在搜索过程中总是首先搜索下面一步的所有可能状态,然后再进一步考虑更后