数据结构(C实现)------- 遍历二叉树

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020

二叉树是另一中树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。

根据二叉树的的递归定义可知,二叉树是由3个基本单元组成,根结点、左子树和右子树,因此,若能依次遍历这三部分,便是遍历了整个二叉树。假如以L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则可能有DLR、LDR、LRD、DRL、RDL、RLD这6种遍历二叉树的方案。若限定先左后右,则只有前3种情况,分别称为先序遍历、中序遍历和后序遍历,另外,还有一种遍历方法,即从上到下,从左到右依次遍历二叉树的每个结点,称之为层次遍历。 故,共有4种遍历二叉树的方法。

二叉树遍历操作定义:

1. 先序遍历二叉树的操作定义:

若二叉树为空,则空操作;否则

1) 访问根结点

2) 先序遍历左子树

3) 先序遍历右子树

2. 中序遍历二叉树的操作定义:

若二叉树为空,则空操作;否则

1) 中序遍历左子树

2) 访问根结点

3) 中序遍历右子树

3. 后序遍历二叉树的操作定义:

若二叉树为空,则空操作;否则

1) 后序遍历左子树

2) 后序遍历右子树

3) 访问根结点

4. 层次遍历二叉树的操作定义:

若二叉树为空,则空操作;否则

1) 从上到下

2) 同一层,从左到右依次遍历

二叉树的存储结构:

1. 顺序存储结构:

#define MAX_TREE_SIZE 100
typedef char TElemType;
typedef TElemType SqBiTree[MAX_TREE_SIZE];
SqBiTree bt;

2. 链式存储结构:

//二叉树的的
#define MAXSIZE 100 //二叉树中最多的结点数 
typedef char TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

二叉树的遍历具体实现:

#include <stdio.h>
#include <stdlib.h>

//二叉树的的
#define MAXSIZE 100 //二叉树中最多的结点数 
typedef char TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//定义函数指针
typedef void(* Visit)(BiTree);

//二叉树的初始化
void Init_BiTree(BiTree *T){
	*T = NULL;
}

//判断二叉树是否为空,返回1
int IsEmpty_BiTree(BiTree *T){
	return *T == NULL;
}

//创建二叉树
void Create_BiTree(BiTree *T){
	char ch;
	ch = getchar();
	//当输入的是"#"时,认为该子树为空
	if(ch == '#')
		*T = NULL;
	//创建树结点
	else{
		*T = (BiTree)malloc(sizeof(BiTNode));
		(*T)->data = ch; //生成树结点
		//生成左子树
		Create_BiTree(&(*T)->lchild);
		//生成右子树
		Create_BiTree(&(*T)->rchild);
	}
}

//输出结点的值
void Print_BiTreeNode(BiTree T){
	printf("%c\t",T->data);

}

//先序遍历二叉树
void PreOrder_BiTree(BiTree T,Visit visit){
	if(!IsEmpty_BiTree(&T)){
		visit(T);
		PreOrder_BiTree(T->lchild,visit);
		PreOrder_BiTree(T->rchild,visit);
	}
}
//中序遍历二叉树
void InOrder_BiTree(BiTree T,Visit visit){
	if(!IsEmpty_BiTree(&T)){
		InOrder_BiTree(T->lchild,visit);
		visit(T);
		InOrder_BiTree(T->rchild,visit);
	}
}

//后序遍历二叉树 
void PostOrder_BiTree(BiTree T,Visit visit){
	if(!IsEmpty_BiTree(&T)){
		PostOrder_BiTree(T->lchild,visit);
		PostOrder_BiTree(T->rchild,visit);
		visit(T);
	}
}

//层次遍历二叉树 
void LevelOrder_BiTree(BiTree T,Visit visit){
	//用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现
	int front = 0;
	int rear = 0;
	BiTree BiQueue[MAXSIZE];
	BiTree tempNode;
	if(!IsEmpty_BiTree(&T)){
		//将根结点加入到队列中 
		BiQueue[rear++] = T;

		while(front != rear){
			//取出队头元素,并使队头指针向后移动一位 
			tempNode = BiQueue[front++];
			//判断左右子树是否为空,若为空,则加入队列 
			if(!IsEmpty_BiTree(&(tempNode->lchild)))
				BiQueue[rear++] = tempNode->lchild;

			if(!IsEmpty_BiTree(&(tempNode->rchild)))
				BiQueue[rear++] = tempNode->rchild;

			//输出队头结点元素 
			//Vist_BiTreeNode(tempNode->data);
			visit(tempNode);
		}
	}
}

int main(){
	BiTree T;
	//将二叉树初始为一个空的二叉树
	Init_BiTree(&T);
	//创建二叉树
	Create_BiTree(&T);
	//先序遍历
	printf("\n先序遍历结果:");
	PreOrder_BiTree(T,Print_BiTreeNode);
	//中序遍历二叉树
	printf("\n中序遍历结果:");
	InOrder_BiTree(T,Print_BiTreeNode);
	//后序遍历二叉树 
	printf("\n后序遍历结果:");
	PostOrder_BiTree(T,Print_BiTreeNode);
	//层次遍历二叉树 
	printf("\n层次遍历结果:");
	LevelOrder_BiTree(T,Print_BiTreeNode);
	return 0;
}

二叉树的遍历结果:

给定二叉树,如,输入1247###5#8##36###

时间: 2024-10-05 04:25:30

数据结构(C实现)------- 遍历二叉树的相关文章

数据结构6.3_遍历二叉树和线索二叉树

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 访问结点所做的操作依赖于具体的应用问 题. 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础. 一.遍历二叉树 二叉树是由三个基本单元组成的:根(D).左子树(L).右子树(R): 若能依次遍历这三个部分,便是遍历了整个二叉树. 若限定先左后右,则有三种遍历方案: 先根(序)遍历:DLR 中根(序)遍历:LDR 后根(序)遍历:LRD 二叉树的定义是递归的: 遍历二叉树分为递归算法和非递归

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行:第1行输出中序遍历序列:第2行输出后序遍历序列

【数据结构】 非递归前中后序遍历二叉树

数据结构学的递归了,深入了解后写一个三序非递归的版本. //测试数据:abd##eg##h##c#f## #include <cstdio> #include <iostream> typedef char ElemType; typedef struct Node { ElemType elem; struct Node *lchild,*rchild; }Node,*BiTree; typedef struct{ BiTree *base; BiTree *top; int s

javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分析算法的行为时,可用树来描述其执行过程等等. 下面讲解的内容完整代码在这:https://github.com/LukeLin/data-structure-with-js/blob/master/Binary%20tree/BinaryTree.js 首先看看树的一些概念: 1.树(Tree)是n

数据结构实验之求二叉树后序遍历和层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2

数据结构学习笔记(四)---遍历二叉树

遍历二叉树   二叉树是一种非线性的数据结构.所谓的遍历二叉树就是按某种顺序访问二叉树中的每个节点,要求每个节点被访问一次且仅一次. 遍历操作实际上是将非线性结构线性化过程,其结果为线性序列.   二叉树的操作 (1)先序遍历---结束的条件是二叉树是否为空 TLR 先访问根节点: 再先序访问左子树: 再先序访问右子树. (2)中序遍历---结束的条件是二叉树是否为空  LTR 先中序遍历左子树: 再访问根节点: 再中序遍历右子树. (3)后序遍历---结束的条件是二叉树是否为空  LRT 先后

数据结构 《22》---- 二叉树三种遍历的迭代器算法

二叉树的三种遍历有递归版本,和迭代版本.本文介绍一种新的思路. 参考了 http://coolshell.cn/articles/9886.html 在许多应用中,我们还需要对遍历本身进行抽象.假如有一个求和的函数sum,我们希望它能应用于链表,数组,二叉树等等不同的数据结构.这时,我们可以抽象出迭代器(Iterator)的概念,通过迭代器把算法和数据结构解耦了,使得通用算法能应用于不同类型的数据结构. 以下给出了三种遍历的迭代器算法. class Iterator { public: virt

35. 蛤蟆的数据结构笔记之三十五遍历二叉树

35. 蛤蟆的数据结构笔记之三十五遍历二叉树 本篇名言:"冬天已经到来,春天还会远吗? --雪莱" 我们来看徐璈如何遍历二叉树. 欢迎转载,转载请标明出处: 1.  二叉树遍历 二叉树的遍历有三种方式,如下: (1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树.简记根-左-右. (2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树.简记左-根-右. (3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点.简记左-右-根. 2.