数据结构-二叉树的遍历(类C语言描写叙述)

遍历概念

 所谓遍历(Traversal)是指沿着某条搜索路线。依次对树中每一个结点均做一次且仅做一次訪问。訪问结点所做的操作依赖于详细的应用问题。

 遍历是二叉树上最重要的运算之中的一个,是二叉树上进行其他运算之基础。

遍历方案

1.遍历方案

 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此。在任一给定结点上,能够按某种次序运行三个操作:

 (1)訪问结点本身(N),

 (2)遍历该结点的左子树(L),

 (3)遍历该结点的右子树(R)。

以上三种操作有六种运行次序:

 NLR、LNR、LRN、NRL、RNL、RLN。

注意:

 前三种次序与后三种次序对称。故仅仅讨论先左后右的前三种次序。

2.三种遍历的命名

 依据訪问结点操作发生位置命名:

  ① NLR:前序遍历(PreorderTraversal亦称(先序遍历))

——訪问结点的操作发生在遍历其左右子树之前。

  ② LNR:中序遍历(InorderTraversal)

——訪问结点的操作发生在遍历其左右子树之中(间)。

  ③ LRN:后序遍历(PostorderTraversal)

——訪问结点的操作发生在遍历其左右子树之后。

注意:

 因为被訪问的结点必是某子树的根。所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。

NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

遍历算法

1.中序遍历的递归算法定义:

 若二叉树非空。则依次运行例如以下操作:

(1)遍历左子树。

(2)訪问根结点;

(3)遍历右子树。

2.先序遍历的递归算法定义:

 若二叉树非空,则依次运行例如以下操作:

(1) 訪问根结点;

(2) 遍历左子树;

(3) 遍历右子树。

3.后序遍历得递归算法定义:

 若二叉树非空。则依次运行例如以下操作:

(1)遍历左子树。

(2)遍历右子树。

(3)訪问根结点。

4.中序遍历的算法实现

 用二叉链表做为存储结构,中序遍历算法可描写叙述为:

void InOrder(BinTree T)

{ //算法里①~⑥是为了说明运行过程增加的标号

① if(T) { // 假设二叉树非空

②    InOrder(T->lchild);

③    printf("%c",T->data)。 // 訪问结点

④    InOrder(T->rchild);

⑤  }

⑥ } // InOrder

时间: 2024-10-20 05:04:49

数据结构-二叉树的遍历(类C语言描写叙述)的相关文章

数据结构—单链表(类C语言描写叙述)

单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ② 链表中结点的逻辑次序和物理次序不一定同样.为了能正确表示结点间的逻辑关系,在存储每一个结点值的同一时候,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 注意: 链式存储是最经常使用的存储方式之中的一个.它不仅可用来表示线性表.并且可用来表示各种非线性

数据结构——二叉树的遍历

"树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点,子节点有左右之分. 2)存储结构 二叉树的存储结构能够採用顺序存储,也能够採用链式存储,当中链式存储更加灵活. 在链式存储结构中,与线性链表类似,二叉树的每一个结点採用结构体表示,结构体包括三个域:数据域.左指针.右指针. 二叉树在C语言中的定义例如以下: struct BiTreeNode{ int c;

设计模式-适配器模式(Go语言描写叙述)

在上一篇博客设计模式-策略模式(Go语言描写叙述)中我们用最简单的代码用go语言描写叙述了设计模式中的策略模式,用最简单的实例来描写叙述相信能够让刚開始学习的人能够非常轻松的掌握各种设计模式.继上篇博客,我们接着用相同简单的代码来了解一下适配器模式. 适配器模式介绍 说起适配器模式,相信非常多做android的同学第一印象就是AdapterView的Adapter,那它是干嘛用的呢?为什么要叫adapter呢?要了解这个问题.我们首先来看看适配器模式的定义: 将一个类的接口转换成客户希望的另外一

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉

数据结构 - 二叉树的遍历

中序遍历二叉树 1 递归算法 算法的递归定义是: 若二叉树为空,则遍历结束:否则 ⑴ 中序遍历左子树(递归调用本算法): ⑵ 访问根结点: ⑶ 中序遍历右子树(递归调用本算法). 中序遍历的递归算法 void InorderTraverse(BTNode *T) { if (T==NULL) return: InorderTraverse(T->Lchild) ; visit(T->data) ; /* 访问根结点 */ InorderTraverse(T->Rchild) ; } 2

[转]数据结构 二叉树的遍历

/********************************************************************** 二叉树的基本操作 (1)二叉树的数据结构 (2)二叉树的构造 (3)二叉树遍历 :先序,中序,后序 ************************************************************************/ #include <cstdio> #include <cstdlib> const int

数据结构——二叉树层序遍历

层序遍历,即宽度优先遍历,在本算法中,我们还需要将每一层进行分开打印, 对于上图所示的二叉树,我们希望打印出的结果是: 1 2 3 4 5 6 7 8 首先,我们看一下二叉树节点是什么样的: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } 具体实现中,我们采用last表示当前打印的行的最后一个元素的引用

设计模式-策略模式(Go语言描写叙述)

好久没有更新博客了.近期也是在忙着充电,今天这篇博客開始,我们来了解一下设计模式. 设计模式 那什么是设计模式呢?首先来看看我从百科上copy下来的概念吧. 设计模式/软件设计模式(Design pattern)是一套被重复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更easy被他人理解.保证代码可靠性. 恩.大概的意思就是在撸码界由码神们总结的.能够解决软件设计中重复出现的问题的.由大多数人不论什么的设计方式,也能够说是一种编码规则. 初始编码我

【算法拾遗(java描写叙述)】--- 选择排序(直接选择排序、堆排序)

选择排序的基本思想 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,知道所有记录排序完毕.主要有两种选择排序方法:直接选择排序(或称简单选择排序)和堆排序. 直接选择排序 基本思想 第i趟排序開始时,当前有序区和无序区分别为R[1 -- i-1]和R[i -- n](1 <= i <= n-1),该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第一个记录R[i]交换,使R[1 -- i]和R[i+1 -- n]分别变为新的有序区和新的无序区.