数据结构---树---总结

一,一些定义

树的深度定义:对于树中的节点n(i),n(i)的深度定义为,从根到n(i)的唯一路径的长度。

树的高度定义:对于树中的节点n(i),n(i)的高度定义为,从n(i)到树中叶子节点的最长路径的长度。因为树中可能有多个叶子结点,n(i)到每个叶子结点都会有路径,路径最长的即为n(i)的高度。

二,表达式树

表达式树的树叶是操作数,非叶结点是操作符。

表达式树可用来进行表达式求值。对表达式树中序遍历,就会得到一个符合人类习惯的表达式,这是一个中缀表达式。关于中缀表达式,参考:

对表达式树后序遍历,就得到一个后缀表达式,关于后缀表达式,参考:

那,如何构造表达式树呢?

即:给定一个后缀表达式,如何将之转换成中缀表达式?---后缀表达式转换成中缀表达式的过程,即为构造表达式树的过程。

幸运的是:后缀表达式转换成中缀表达式的过程 与 后缀表达式求值的过程非常相似。

算法如下:

输入:后缀表达式

输出:(表达式树)中缀表达式

扫描后缀表达式,一次读入一个符号

①若它是操作数,则建立一个单节点树并将它推入栈中

②若它是操作符,则从栈中弹出两颗树T1(先弹出) 和 T2。该树的树根就是操作符,左、右儿子分别是T2 和 T1,然后再将该树压入栈中。

代码如下:

另外一篇博客--链接

三,查找树---二叉查找树

二叉查找树:对于树中每个节点X,它的左子树所有项的值小于X,它的右子树所有项的值大于X。中序遍历二叉查找树 生成一个有序序列。

二叉查找树的特点:让很多操作都可以在O(logN)的时间内完成。注意,我这里说的是 “可以”,因为:二叉查找树并不是平衡二叉树。

插入操作:

比如,当序列是有序的时,二叉查找树就退化成链表。

例如:1,2,3,4,5作为输入,构造二叉查找树

对于1,作为树的根结点。对于2,作为根结点的右孩子。对于3,作为2的右孩子。对于4,作为3的右孩子,对于5,作为4的右孩子。

这样的二叉查找树的高度为O(N)。 那么相关的操作也降为O(N)

删除操作:

当删除二叉查找树中的某个节点时,不通改变二叉查找树的特点。故,一般采用如下方式删除:

不直接删除该节点,而是删除以该节点为根的左子树中的最右下节点, 或者删除以该节点为根的,右子树中的最左下节点。

由于删除操作可能会改变二叉查找树的高度,如果总是删除”最右下节点“ 或者 ”最左下节点“ 会导致节点严重偏向一边,故可采用随机删除法,即随机地选择”最右下节点“ 或 ”最左下节点“删除。

现在考虑以下几种操作,及它们采用不同的数据结构实现时的时间复杂度情况:

findMin   二叉查找树--O(logN);  线性表--O(N); HashSet--O(N)

HashSet可以遍历每个Entry,然后找出最小的,故时间复杂度为O(N)

findMax  二叉查找树--O(logN);  线性表--O(N); HashSet--O(N)

如果数组有序,findMax操作可为O(1)。但是对于链表而言,findMax只能为O(N)

insert   二叉查找树--O(logN);  线性表--O(N); HashSet--O(1)

在数组中插入时,需要移动元素,平均时间复杂度为O(N)。但对于链表,插入操作可以为O(1)

delete   二叉查找树--O(logN);  线性表--O(N); HashSet--O(1)

在数组中删除时,需要移动元素,平均时间复杂度为O(N)。但对于链表,删除操作可以为O(1)

contains   二叉查找树--O(logN);  数组--O(N); HashSet--O(1)

需要遍历数组一次,才能判断是否包含该元素。当是有序序列时,数组可以采用二分查找,复杂度降为O(logN)

二叉查找树的实现如下:

三,AVL树--平衡二叉树

正是由于二叉查找树的高度随序列而变化。如,当输入序列有序时,构造出来的二叉查找树退化为链表,高度为O(N)。那么相关的操作,如findMax、findMin的时间复杂度也降为O(N)

AVL树要求每棵树的左右子树的高度相关不能超过1,从而保证操作不会退化为O(N)的复杂度。但是AVL树的实现比较复杂。

四,伸展树

相对于AVL的复杂,伸展树要容易实现一些。

伸展树保证对树的连续M次操作的最坏时间复杂度为O(MlogN)。根据摊还分析,摊还到每一次操作的时间复杂度为 MlogN / M = O(logN)

时间: 2024-08-27 20:24:00

数据结构---树---总结的相关文章

数据结构--树(定义与存储结构)

树基本定义 树的定义 数是具有n个节点的有限集.如图即是一个树形结构. 节点分类 节点的度:一个节点拥有的子节点即成为节点的度,比如A节点,有B和C两个子节点,那么A节点的度=2. 叶节点(终端节点):没有子节点的节点,比如G.H.I.... 如图: 节点间关系 孩子节点:某一个节点的子节点称为孩子节点.比如B.C节点是A节点的孩子节点. 双亲节点:与孩子节点相反.比如,A节点是B.C的双亲节点. 兄弟节点:同一个双亲节点的孩子节点,之间称为兄弟节点.比如,B.C为兄弟节点. 如图: 树的存储结

数据结构--树的一些计算

先解释一下一些最基本的概念 结点的孩子结点个数即为该结点的度.度为0的结点叫叶子结点.处在树的最顶端(没有双亲)的结点叫根结点. 介绍一下公式 k:总度数k+1:总节点数 为什么总节点数肯定比总度数多1呢?其实很简单可以解释,度可以看作节点与节点之间的线,多1就是显而易见的 设该二叉树总结点数为N,叶子结点个数为n0,度为1的结点个数为n1.度为2的节点个数为n2下面可得两等式:(1) N = n2 + n0 + n1;依据:很显然,二叉树总结点数等于度分别为0,1,2的结点个数总和.(2) N

数据结构---树、二叉树、森林

1.基本术语: 度:有两种度"结点的度"与"树的度".结点的度指的是一个结点子树的个数:树的度是指树中结点度的最大值. 叶子结点:指的是没有子树的结点. 层:树是有层次的,一般根结点为第0层.规定根结点到某结点的路径长度为该结点的层数. 深度:树中结点的最大层数 兄弟:同一双亲的结点,互为兄弟 堂兄弟:双亲在同一层次的结点,互为堂兄弟 祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先. 子孙:以某一结点为根的子树上的所有结点都是该结点的子孙 森林:n棵互不相

01-(2)数据结构-树

数据结构——树 标签: 数据结构树 2014-12-07 15:46 972人阅读 评论(0) 收藏 举报  分类: 数据结构(8)  一.树的定义 树是n(n>=0)个结点的有限集.n=0时称为空树,在任意一颗非空树:1.有且仅有一个特定的根结点.2.当n>1时其余结点可分为m(m>0)个互不相交的有限集T1.T2......Tm,其中每一个集合本身又是一棵树,并且称为根的子树. 二.结点的度,拥有的子树称为结点的度 如上图结点A的度是2,结点B的度是1,结点C的度是2,结点E的度是3

数据结构——树状数组

我们今天来讲一个应用比较广泛的数据结构——树状数组 它可以在O(nlogn)的复杂度下进行单点修改区间查询,下面我会分成三个模块对树状数组进行详细的解说,分别是树状数组基本操作.树状数组区间修改单点查询的实现.树状数组查询最值的实现 一. 树状数组一般分为三种操作,初始化.修改.查询 在讲基本操作之前,我们先来看一张图 这张图就是树状数组的存储方式,对于没有接触过树状数组的人来说看懂上面这张图可能有些困难,上图的A数组就是我们的原数组,C数组则是我们需要维护的数组,这样存储能干什么呢,比如我们在

数据结构 树(下)

数据结构 树(下) 一.概述 AVL树.伸展树.红黑树搜索树算法保证最坏情况或者一系列操作情况下,搜索.插入和删除的操作的时间复杂度是O(logn).本文主要内容包含:平衡搜索树中的AVL树.伸展树.(2,4)树.红黑树 和(a,b)树.B树等实际运用的树数据结构. 二叉搜索树的删除 二.AVL树 1.基本知识 1.AVL树是维持对数O(logn)的高度的特殊二叉搜索树.“高度”指根节点到叶子节点最长路径上的节点的数量.“None”的孩子的高度是0,叶子节点的高度是1,父节点是叶子节点的高度加1

数据结构 树(上)

数据结构 树(上) 一.概述 主要内容包含树的基本概念.二叉树(平衡二叉树.完全二叉树.满二叉树).搜索树(二叉搜索树.平衡搜索树.AVL树.伸展树.(2,4)树.红黑树).(a,b)树.B树等实际运用的树数据结构 二.基本知识(树的定义和属性) 1.树(非线性数据结构)运用于一些算法实现的效率会比线性数据结构(基于数组的列表和链表)快,广泛运用于文件系统目录结构.图形用户界面.MySQL数据库索引.网站.路由协议和其他计算机系统中 2.树T定义为存储一系列元素的有限节点集合,这些节点具有 pa

数据结构 - 树 复习(不详细)

数据结构 - 树 首先回忆一下树的术语 节点的度:一个节点含有的子树的个数称为该节点的树 树的度:一棵树中,最大的节点的度称为树的度 节点的层次:从根开始定义,根为第一层(有时候定义为第0层) 高度:对于任意节点n,n的高度为n到一片树叶的最长路径的长度,所有树叶的高度为0 树的遍历 前序遍历:先访问根,然后访问左右子树 中序遍历:先访问左子树,然后访问根,最后访问右子树 后序遍历:先访问子树,然后访问根 层序遍历:先访问离根节点最近的节点,按层遍历 #include<iostream> us

数据结构——树笔记1

树属于非线性数据结构,它是一种层次结构:如果存在前驱节点,则是唯一的,如果存在后继节点,则可以是多个.即树的元素之间是一对多的关系.树是由n个节点构成的有限集合T,如果n = 0,则是空树,如果n不等于0,则一个非空树,有且只有一个根结点root,如果n>1,则除了根结点外,其余节点又可以划分为有限集T1,T2......Tm 其中每个有限集有是一棵树.称为子树subtree. 树的存储结构    双亲表示法  孩子表示法 孩子兄弟表示法(二叉树表示法) 森林:M棵互不相交的树的集合. 二叉树:

数据结构--树

无论是链表,栈还是队列,它们都是线性结构的,每个节点的左边最多一个节点,右边也最多一个节点,对于大量的输入数据,线性表的访问时间太慢,不宜使用.这里我要说一种非线性的数据结构,其大部分操作的运行时间平均为O(logn). 我们涉及到的这种数据结构叫做树.在计算机科学中,树是非常有用的抽象概念.我们形象的去描述一棵树,一个家族的老祖可能有两个儿子,这两个儿子一个有一个儿子,一个有三个儿子,像这样发展下去的一个族谱,就是一个树.下面是常见的一种树:二叉树. 本文中以二叉树为例,将二叉树的数据结构定义