树、二叉树基础

刚看到堆排序,顺便记录一下关于树的一些基本概念:

前言

前面介绍的栈、队列都是线性结构(linear structure)。而树是非线性结构(non-linear structure)。因此,树中的元素之间一般不存在类似于线性结构的一对一的关系,更多地表现为多对多的关系。直观地看,它是数据元素(在树中称为节点)按分支关系组织起来的结构。显然,树形结构是比线性结构更复杂的一种数据结构类型。

一、树

树的定义:树是含有n个节点的有穷集合,其中有一个节点比较特殊称为根节点。在图示树时,用一条边连接两个有逻辑关系的节点,这个关系被称为父子关系。

二、二叉树

二叉树(Binary Tree)由节点的有限集合构成。这个集合或者为空集,或者为由一个根节点(root)和两棵互不相交,分别称为这个根的左子树(left subtree)和右子树(right subtree)的二叉树组成的集合。

一棵二叉树的示意图:

三、树和二叉树的主要区别

  1. 树中节点的最大度数没有限制,而二叉树节点的度不超过2。
  2. 树中节点的孩子节点,无左右之分,而二叉树中是有区分的,即孩子是有区别的:左孩子、右孩子,且次序不可颠倒。
  3. 树的结点个数至少为1,而二叉树的结点个数可以为0。

四、常见概念

  1. 节点的度:某节点的度定义为该节点孩子节点的个数。
  2. 叶子节点:度为0的节点。
  3. 树的度:一棵树中,最大的节点的度称为树的度。
  4. 节点的高度:从该节点起到叶子节点的最长简单路径的边数。(简单路径:无重复边的路径)
  5. 树的高度:根节点的高度。
  6. 节点的层数:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
  7. 数的层数:根节点的层数。
  8. 节点的深度:即该节点的层数。
  9. 树的深度:根节点的深度。
  10. 外节点:叶子节点。
  11. 内节点:除叶子节点之外的节点。
  12. 满二叉树:二叉树中节点的度只能是0或2。
  13. 完全二叉树:除最后一层,每一层的节点数都达到最大。最后一层若是没满,则节点集中在左边,空的只能是右边。
  14. 扩充二叉树:对二叉树中度为1的节点和叶子节点添加空节点,使之成为满二叉树。

注:关于树深度、层数、高度的定义会有不同的说法:有从0开始计数的,也有从1开始计数的。从哪儿开始计数不是关键,关键在于一致性,量的写法要一致。

五、几个量的关系

  1. 对于二叉树,根节点是第一层,则第i层至多有个结点。若共有k层,则最多有节点个。
  2. 按层次顺序对一棵有n个节点的完全二叉树的所有节点从0到n-1编号。若父节点的编号是i,则左孩子的编号是2*i+1,右孩子的编号是2*i+2。(当然,这是在存在左右孩子的情况下)。同样的,若孩子(无论左右孩子)节点是i,则父节点是(i-1)/2。
  3. 对于一棵满二叉树,外部节点或者说是叶子节点数是n,则内部节点数是n-1。
  4. 对于一棵二叉树,用ni表示度为i的节点个数,则n0=n2+1。证明如下:总节点数n=n0+n1+n2。用e表示边数,则n=e+1,这是因为除根节点外,每一个节点都和一条边对应。同时,e=2n2+n1,推出n0+n1+n2=2n2+n1+1,化简即得n0=n2+1。这个结论用语言表述:二叉树中,叶子节点比度为2的节点多一个。
  5. 有n个节点的完全二叉树,树高度,即logn向下取整,高度从0计数。
  6. 在二叉树中,第i层的第一个节点(最左边的节点)的编号是,层数从0计数。这个量在选择排序:树形选择中用到了。

六、示意图




 

专栏目录:

转至:http://blog.csdn.net/zhangxiangdavaid/article/details/36189717

时间: 2024-10-11 12:21:35

树、二叉树基础的相关文章

二叉树基础及应用

二叉树基础: 刚看到堆排序,顺便记录一下关于树的一些基本概念: 前言 前面介绍的栈.队列都是线性结构(linear structure).而树是非线性结构(non-linear structure).因此,树中的元素之间一般不存在类似于线性结构的一对一的关系,更多地表现为多对多的关系.直观地看,它是数据元素(在树中称为节点)按分支关系组织起来的结构.显然,树形结构是比线性结构更复杂的一种数据结构类型. 一.树 树的定义:树是含有n个节点的有穷集合,其中有一个节点比较特殊称为根节点.在图示树时,用

树的基础

一.树的介绍 1.树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点: (01) 每个节点有零个或多个子节点: (02) 没有父节点的节点称为根节点: (03) 每一个非根节点有且只有一个父节点: (04) 除了根节点外,每个子节点可以分为多个不相交的子树. 2.树的基本术语 若一个结点有子树,那么该结点称为子树根的"双亲",子树的

HDU1166 线段树(最基础题)

1.写法一: 1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 5 using namespace std; 6 7 int numv[50005<<2]; 8 int A[50005]; 9 10 void builtTree(int o,int l,int r){ 11 if(l==r) { 12 numv[o]=A[l]; 13 return ; 14 } 15 int

纸上谈兵: 树, 二叉树, 二叉搜索树

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(

树——二叉树的线索化

1,什么是线索化二叉树? 1,将二叉树转换为双向链表的过程(非线性 ==> 线性): 1,实际工程开发中,很大一部分情况下,二叉树一旦建立之后,就不会轻易改动,一般的用于遍历,并且这种操作一般执行很多: 2,先中后序遍历都是递归完成的,实际工程开发中,对一棵已经建立的二叉树反复执行先序遍历,效率低,所以不推荐反复的递归的遍历: 3,直接将遍历后的结果保存下来,下一次遍历直接用这个结果就可以: 4,工程开发中还有一种常见情况,就是要反复的知道某个结点在中序遍历下,前驱结点是谁.后继结点是谁,需要这

树——二叉树的先序、中序和后序遍历

1,二叉树是否只有一种遍历方式(层次遍历)? 2,典型的二叉树的遍历方式: 1,先序遍历(Pre-Order Traversal): 2,中序遍历(In-Order Traversal): 3,后序遍历(Post-Order Traversal): 3,先序遍历(“先序”指最先访问根结点中的数据元素): 1,二叉树为空: 1,无操作,直接返回: 2,二叉树不为空: 1,访问根结点中的数据元素: 2,先序遍历左子树: 3,先序遍历右子树: 4,先序遍历功能定义及其代码实现: 1,代码示例: 1 p

[转帖]AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解

AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 https://segmentfault.com/a/1190000016231512 太长没看完.. javascriptvue-clicommonjswebpackast 阅读约 27 分钟 抽象语法树(AST),是一个非常基础而重要的知识点,但国内的文档却几乎一片空白. 本文将带大家从底层了解AST,并且通过发布一个小型前端工具,来带大家了解AST的强大功能 Javascript就像一台精妙运作的机器,我们可以

AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解

AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解 javascriptvue-clicommonjswebpackast 阅读约 27 分钟 抽象语法树(AST),是一个非常基础而重要的知识点,但国内的文档却几乎一片空白. 本文将带大家从底层了解AST,并且通过发布一个小型前端工具,来带大家了解AST的强大功能 Javascript就像一台精妙运作的机器,我们可以用它来完成一切天马行空的构思. 我们对javascript生态了如指掌,却常忽视javascript本身

树与二叉树基础算法的比较

一:树的创建 在数据结构中,树是以二叉树的形式储存的. 树转换为二叉树形式分为三步: ⑴加线——树中所有相邻兄弟之间加一条连线. ⑵去线——对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线. ⑶层次调整——以根结点为轴心,将树顺时针转动一定的角度,使之层次分明. 转换后结果如图: 所以树的创建算法有两个思路: 1.将树转化为二叉树后,以二叉树中结点的关系输入而创建树. 2.直接以树中结点的关系输入,用代码转换为相应的二叉树. 第一种方法实际就是二叉树创建,只不