树的基本概念

树是由\(n (n \ge 0)\)个节点组成的有限集合(记为\(T\))。其中如果\(n=0\),它是一棵空树;如果\(n \gt 0\),这 \(n\)个节点中存在一个节点作为树的根节点,其余节点可分为\(m (m \ge 0)\)个互不相交的有限集\(T_1、T_2、...T_m\),其中每个集合本身又是一棵树,称为根节点的子树。「递归定义」

一些基本概念

  • 节点的度:节点中拥有的子树个数或者分支个数。
  • 树的度:树中各节点度的最大值,通常将度为\(m\)的树称为\(m\)次树。
  • 叶子(终端)节点:度为 \(0\) 的节点
  • 分支(非终端)节点:度不为 \(0\) 的节点
  • 层次:从根开始,根为第一层,根的孩子为第二层,依次类推
  • 树的高度:树中节点的最大层次。
  • 森林:\(n (n \ge 0)\) 个互不相交的树的集合称为森林。森林和树的定义十分相似,只要把树的根节点删除就成了森林,反之,只要给 \(n\) 棵独立的树加上一个节点,并把这\(n\)棵树作为该节点的子树,则森林变成了树

树的一些性质

  • 树中的节点数 \(n\) 等于所有节点的度数加 \(1\)。度之和=分支数,而分支数=n-1
  • 度为\(m\)的树中第\(i\)层上至多有 \(m^{i-1}\) 个节点
  • 高度为 \(m=h\) 的树中第\(i\)层上至多有 \(\frac{m^{h}-1}{m-1}\) 个节点
  • 具有\(n\)个节点的 \(m\)次树的最小高度为 \(\ulcorner log_m(n(m-1)+1)\urcorner\)

树的存储结构

  • 双亲存储结构: 顺序存储结构,用一组连续空间存储树的所有节点,同时在每个节点中附设一个伪指针指示其双亲节点的位置。其中根节点的伪指针为\(-1\)。
    ?
    利用了每个节点(根节点除外)只有唯一双亲节点的性质。这种存储结构中,求某个节点的双亲节点的时间复杂度为\(O(1)\),求某个节点的孩子节点的时间复杂度为 \(O(n)\)
  • 孩子链存储表示:\(d\)越大,空间浪费越严重。
    ?
    ?
  • 孩子兄弟链存储:
    ?
    ?

树的遍历

  • 先根遍历:先访问根节点,再按照从左到右的次序先根遍历该根节点的每一个子树:

    ?

  • 后根遍历:先按照从左到右的次序后根遍历根节点的每一棵子树,再访问根节点。

二叉树

二叉树是由 \(n (n \ge 0)\) 个节点的有限集合,该集合或者为空集

,或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成。

?

  • 满二叉树:一棵高度为\(h\) 且有\(2^h-1\)个节点的二叉树。即所有分支节点都有左右孩子,并且叶子节点集中在二叉树的最下层。

    • 叶子节点都在最后一层
    • 只有度为 \(0\) 和度为 \(2\) 的节点
  • 完全二叉树:对一棵具有\(n\)个节点的完全二叉树按层次编号,当且仅当每一个节点都与高度为 \(h\) 的满二叉树编号一一对应
    • 叶子节点只可能在层次最大的两层上出现
    • 对于最大层次中的叶子节点,都依次排列在该层最左边的位置上
    • 如果有度为 \(1\) 的节点,只可能有 \(1\) 个,且该节点只有左孩子而无右孩子
    • 按层次编号后,一旦出现某个节点(其编号为\(i\))为叶子节点或只有左孩子,则编号大于 \(i\) 的节点均为叶子节点
    • 当节点总数\(n\)为奇数时,\(n_1=0\),当节点总数为\(n\)为偶数时\(n_1=1\)

二叉树的性质

  • 每个节点最多有两棵子树,二叉树中不存在度为\(2\)的节点
  • 子树的顺序不能颠倒,某节点即使只有一棵子树也要区分是左子树还是右子树
  • 由\(n\)个节点构成的二叉树的形态总数为\(\frac{C_{2n}^n}{n+1}\)
    ?
  • 非空二叉树的叶子节点数等于双分支节点数\(+1\)
  • 具有\(n\) 个节点的完全二叉树的高度为\(\ulcorner log_2(n+1) \urcorner\)

二叉树的存储

  • 树的顺序存储:用一个数组来存储一棵二叉树,这种存储方式最适合于完全二叉树,用于存储一般的二叉树会浪费大量的存储空间。
    ?
    ?
  • 链式存储结构:
    • 二叉链存储结构:?
      ?
    • 三叉链表存储结构:?

二叉树的遍历

  • 先根(前序)遍历:
    ?
    ?
  • 中根(中序)遍历:

    ?

    中序遍历的非递归实现:先扫描(并非访问)根节点的所有左节点并将它们一一进栈。然后出栈一个节点p,显然p没有左孩子节点或者左孩子节点已经访问过了,则访问它,然后扫描该右孩子节点的所有左孩子节点并一一进栈,如此继续直到栈空为止。

    ?

  • 后根(后序) 遍历:

    ?

    后序遍历的非递归实现:先扫描根节点的所有左节点并一一进栈,扫描完之后出栈一个节点*p,即当前节点,然后扫描该节点的右孩子节点并进栈,再扫描该右孩子的节点的所有左节点并进栈。当一个节点的左、右孩子节点均访问后再访问该节点,如此反复,直到栈空为止。

    难点是怎么判断一个节点的右孩子节点已经访问过?,不妨使用q来保存右子树中刚刚被访问的节点(初值为NULL),若此时满足p->rchild==q成立,说明此时p的左右孩子均已访问,现在应该访问p节点。

    ?

时间: 2024-08-13 17:51:49

树的基本概念的相关文章

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

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

哈夫曼树的基本概念

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

树的基本概念及算法

基本概念: 某个结点的度:该结点的子树个数: 树的度:该树中的任意结点的度的最大值: 高度:叶子结点高度为1,根结点高度最高: 森林:多个树组成(怎么组成?暂时不看). 树的子树的个数没有限制(但是子树之间一定没有相交). 树的转换: 树->二叉树:3步(临时只写最后一步):第一个孩子是该结点的左孩子,该结点的兄弟转换为右孩子. 森林->二叉树:森林的每棵树(分别转换)->二叉树->组合成一颗二叉树:将后一颗二叉树的根结点转换为前一颗二叉树根结点的右孩子. 二叉树->树:1加

AVL树 &amp; 重平衡概念

AVL树是有平衡条件的二叉搜索树.这个平衡条件必须容易保持,而且需要保证树的深度是O(logN). AVL=BBST 作为二叉搜索树的最后一部分,我们来介绍最为经典的一种平衡二叉搜索树:AVL树.回顾此前的几节,我们首先介绍的是二叉查找树BST.然而我们也能感受到,尽管从同时兼顾高效的静态操作 和动态操作的角度讲,BST相对此前简单的向量和链表已经具有某种优势和潜质,但是毕竟它并不能保证这一点.其原因在于 它的高度,无论是从平均情况 还是最坏情况都不能保证做到足够的低,具体来说也就是做到logN

树的基础概念(二)

堆 堆:经过排序的完全二叉树,其中任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子结点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根节点的键值是所有堆结点键值中最大者. 最小堆:根节点的键值是所有堆结点键值中最小者. 最大-最小堆:集结了他俩的优点.是最大层和最小层交替出现的二叉树,即最大层节点的儿子属于最小层,最小层节点的儿子属于最大层.以最大(小)层节点为根节点的子树保有最大(小)堆性质:根节点的键值为该子树结点键值中最大(小)项. ======================

树(基本概念及存储结构)

树的定义--递归(两者相联系) 根节点:唯一 节点的度:节点拥有的子树数,度为0->称为终端节点或叶节点 树的度:树内各节点的度的最大值 内部节点:除根节点外的节点 孩子(child):节点的子树的根 称为该节点的 孩子,反过来,称为双亲(parent) 兄弟(sibling):同一双亲的孩子之间的关系 节点的祖先:从根到该节点所经分支上的所有节点 节点层次:根为第一层,根的孩子为第二层 树的深度(Depth):树中节点的最大层次 森林(Forest):是m(m>0)棵互不相交的树的集合 树的

数据结构学习——树的基本概念

参考书籍<数据结构与算法分析--C语言描述> 连接俩个节点的称为边 一棵树是N个节点和N-1条边的集合 没有儿子的节点称为树叶(叶). 具有相同父亲的称为兄弟. 对任意节点ni,ni的深度为从根到ni的唯一路经长,其中根的深度为0.一棵树叶的深度等于它最深的树叶深度. ni的高是从ni到一片树叶的最长路径的长,一棵树的高等于它根的高,所有树叶的高都是0. 某路径的长为该路径上边的条数. 一棵树的所有节点的深度的和称为内部路径长. 下图所示的树中: 树的根节点为20,有7个节点,3个叶节点. 节

树的基础概念

树由很多结点组成. 结点的度:结点拥有的直接子结点数. 叶子:度为0的结点. 树的度:所有结点的度中的最大值. 一个结点的直接子结点称为它的孩子. 双亲. 兄弟:相同双亲的孩子结点. 一个结点的祖先:从跟到该结点所经过的所有结点. 树的层次:根记为第一层,层次也称为树的深度. 双亲在同一层的结点互称为堂兄弟.

PHP算法 《树形结构》 之 伸展树(1) - 基本概念

伸展树的介绍 1.出处:http://www.cnblogs.com/skywang12345/p/3604238.html 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造.(01) 伸展树属于二叉查找树,即它具有和二叉查找树一样的性质:假设x为树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x].如果y是x的左子树中的一个结点,则key[y] <= key