树的基本概念和遍历规则

树的递归定义

树是n(n>0)个结点的有限集,这个集合满足以下条件:

⑴有且仅有一个结点没有前驱(父亲结点),该结点称为树的根;

⑵除根外,其余的每个结点都有且仅有一个前驱;

⑶除根外,每一个结点都通过唯一的路径连到根上(否则有环)。这条路径由根开始,而未端就在该结点上,且除根以外,路径上的每一个结点都是前一个结点的后继(儿子结点);

由上述定义可知,树结构没有封闭的回路。

节点的分类

结点一般分成三类

⑴根结点:没有父亲的结点。在树中有且仅有一个根结点。如节点r

⑵分支结点:除根结点外,有孩子的结点称为分支结点。如a,b,c,x,t,d,i

⑶叶结点:没有孩子的结点称为树叶。如w,h,e,f,s,m,o,n,j,u

根结点到每一个分支结点或叶结点的路径是唯一的。

从根r到结点i的唯一路径为rcti。

树的度

⑴结点的度:一个结点的子树数目称为该结点的度。如结点i的度为3,节点t的度为2,节点b的度为1。显然,所有树叶的度为0。

⑵树的度:所有结点中最大的度称为该树的度(宽度)。             下列树的度为3。如果采用数组存储子节点地址的话,则应根据树的度定义数组大小

树的深度

树是分层次的。结点所在的层次是从根算起的。根结点在第一层,根的儿子在第二层,其余各层依次类推。即某个节点在第k层,则该节点的后件均在第k+1层。

在树中,父结点在同一层的所有结点构成兄弟关系。

树中最大的层次称为树的深度,亦称高度。图中树的深度为5。

森林

所谓森林,是指若干棵互不相交的树的集合。如图去掉根结点,其原来的三棵子树Ta,Tb,Tc的集合{Ta,Tb,Tc}就为森林,这三棵子树的具体形态如下:

有序树和无序树

按照树中同层结点是否保持有序性,可将树分为有序树和无序树。

(1)如果树中同层结点从左而右排列,其次序不容互换,这样的树称为有序树;

(2)如果同层结点的次序任意,这样的树称为无序树。

树的表示方法

⑴自然界的树形表示法:

用结点和边表示树,例如上图采用的就是自然界的树形表示法。树形表示法一般用于分析问题。

优点:直观,形象;缺点:保存困难。

⑵括号表示法:

先将根结点放入一对圆括号中,然后把它的子树按由左而右的顺序放入括号中,而对子树也采用同样方法处理:同层子树与它的根结点用圆括号括起来,同层子树之间用逗号隔开,最后用闭括号括起来。例如图可写成如下形式

(A(B(E(K,L),F),C(G),D(H(M),I,J)))

优点:易于保存;缺点:不直观

树的遍历规则

所谓树的遍历,是指按照一定的规律不重复地访问(或取出节点中的信息,或对节点做其他的处理)树中的每一个节点,其遍历过程实质上是将树这种非线性结构按一定规律转化为线性结构。

先根次序遍历

后根次序遍历

先根次序遍历树

先根次序遍历的遍历规则为:若树为空,则退出;否则先根访问树的根点,然后先根遍历根的每棵子树。例如,对右图所示树进行先根次序遍历,形成的次序为:

Rawxdhebfcstimonju

算法为:

program preorder(v:integer);

{访问处理节点v;

for i in adj(v) do if i未访问 then  preorder(i);

}

后根次序遍历树

后根次序遍历的遍历规则为:若树为空,则退出;否则后根访问每棵子树,然后访问根节点。例如,对右图所示树进行后根次序遍历,形成的次序为:

whdexafbsmonijtucR

算法为:

program postorder(v:integer);

{for i in adj(v) do if i未访问 then  postorder(i);

访问处理节点v;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 12:15:05

树的基本概念和遍历规则的相关文章

学习日志---二叉树概念与遍历(递归)

概念: 树,简单来说这种结构每个节点至多只有一个父节点,父节点可以有多个子节点. 树的内部概念: 结点:结点由数据元素和构造数据元素之间关系的指针组成.     结点的度:结点所拥有的子树的个数称为该结点的度.     叶结点:度为0的结点称为叶结点,叶结点也称作终端结点.     分支结点:度不为0的结点称为分支结点,分支结点也称  作非终端结点.     孩子结点:树中一个结点的子树的根结点称作这个结点的孩子结点.     双亲结点:若树中某结点有孩子结点,则这个结点就称作它的孩子结点的双亲

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

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

JavaScript之DOM-4 文档结构和遍历(节点树、元素树、文档的遍历)

一.节点树 节点树 概念 - HTML DOM 将 HTML 文档视作树结构 - 文档中的元素.属性.文本.注释等都被看作一个节点 - 这种结构被称为节点树: 上下层节点 - 节点树中的节点彼此拥有层级关系,DOM 使用如下属性遍历整棵节点树: 平行的节点 - 节点树中使用如下方法访问平行的兄弟节点: 二.元素树 元素树 概念 - 元素树是节点树的一个子集,只包含其中的元素节点 上下层元素 - 与节点树一样,元素树上的元素节点也有父子关系,使用如下属性可以获取这些关系: 平行的元素 - 元素树使

二叉树的遍历规则(前序遍历、后序遍历、中序遍历)

今天看了一些关于平和查找二叉树的问题,顺便也复习了一下二叉树的遍历规则,写一下学习文档. 树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 如图所示二叉树: 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回. 前序遍历的规则: (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成. 前序遍历的输出结果:ABDECF 中序遍历:中序遍历可以记为左根右,也

树的深度优先与广度优先遍历

简述树的深度优先及广度优先遍历算法,并说明非递归实现. 原题出自百度的笔试: 当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构: 深度优先遍历--->栈: 广度优先遍历--->队列: 这里以二叉树为例来实现. import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode rig

python数据结构与算法 36 树的基本概念

树 学习目标 理解什么是树及使用方法 学会使用树实现映射 用列表实现树 用类和引用实现树 用递归实现树 用堆实现优先队列 树的例子 前面我们学习过栈和队列这类线性数据结构,并且体验过递归,现在我们学习另一种通用数据结构,叫做树.树在计算机科学中应用广泛,象操作系统.图形学.数据库系统.网络等都要用到树.树和他们在自然界中的表哥--植物树--非常相似,树也有根,有分枝,有叶子.不同之处是,数据结构的树,根在顶上,而叶子在底部. 在开始学习之前,我们来研究几个普通的例子.第一个是生物学上的分级树.图

哈夫曼树的基本概念

这里有一篇博文讲哈夫曼树,概念讲的挺好的   一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率.例如,编制一个程序,将百分制转换成五个等级输出.大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: [cpp] view plaincopy if(score<60) cout<<"Bad"<<endl; else i

数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出 样例输入 A B # D # # C E # # F # # 样例输出 LevelOrder: A B C D E F 代码: #include <iostream> #include <queue> using namespace std; struct node { //表示一个树上的节点 char ch; node *left, *right; }; node* creat() { //以递归的方式构造一棵二叉树 node *root =

二叉树遍历规则,先顺遍历/中序遍历/后序遍历

二叉树三种遍历方式 先序遍历:遍历顺序规则为[根左右] 先访问根节点,在左叶子,右叶子 中序遍历:遍历顺序规则为[左根右] 后序遍历:遍历顺序规则为[左右根] 例题 先序遍历:ABCDEFGHK 中序遍历:BDCAEHGKF 后序遍历:DCBHKGFEA 以中序遍历为例: 中序遍历的规则是[左根右],我们从root节点A看起: 此时A是根节点,遍历A的左子树: A的左子树存在,找到B,此时B看做根节点,遍历B的左子树: B的左子树不存在,返回B,根据[左根右]的遍历规则,记录B,遍历B的右子树: