【数据结构和算法】:树和二叉树定义、基本术语和性质

树的定义和基本术语

?树:是一类重要的非线性数据结构,是以分支关系定义的层次结构。

?根:树(tree)是n(n>=0)个结点的有限集T,对于非空树,其中有且仅有一个特定的结点,称为树的根(root)。

?子树:当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)。每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。

结点:包含一个数据元素及若干指向子树的分支。

结点的度:结点子树的个数。

树的度: 树中最大的结点度。

叶子结点:也叫终端结点,是度为 0 的结点。

分枝结点:度不为0的结点。

从根到结点的路径:由从根到该结点所经分支和结点构成。

孩子结点:结点的子树的根称为该结点的孩子。

双亲结点:B结点是A结点的孩子,则A结点是B结点的双亲。

兄弟结点:同一双亲的孩子结点。

堂兄结点:同一层上结点。

祖先结点: 从根到该结点的所经分支上的所有结点子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙。

结点的层次:根结点的层定义为1;根的孩子为第二层结点,依此类推。

树的深度:树中最大的结点层。

有序树:子树有序的树。

无序树:不考虑子树的顺序。

森林: m(m>=0)棵互不相交的树的集合。

线性结构:第一个数据元素(无前驱),最后一个数据元素(无后继),其它数据元素(一个前驱,一个后继)

树:根结点(无前驱),多个叶结点(无后继),树中其它结点(一个前驱,多个后继)

二叉树

定义:二叉树是n(n30)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。

特点:

1.每个结点至多有二棵子树(即不存在度大于2的结点);

2.二叉树的子树有左、右之分,且其次序不能任意颠倒。

二叉树的五种基本形态

(1)满二叉树

一棵深度为k的且有 个结点的二叉树叫满二叉树。

特点:每一层上的结点数都是最大结点数。

(2)完全二叉树

深度为k,有n个结点的二叉树当且仅当其每一个 结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树。

特点:叶子结点只可能在层次最大的两层上出现。 对任一结点,若其右分支下子孙的最大层次为L,则其左分支下子孙的最大层次必为L或L+1。

二叉树具有以下重要性质:

性质1 二叉树第i层上的结点数目最多为2i-1(i≥1)。

证明:用数学归纳法证明:

     归纳基础:i=1时,有2i-1=20=1。因为第1层上只有一个根结点,所以命题成立。

 归纳假设:假设对所有的j(1≤j<i)命题成立,即第j层上至多有2j-1个结点,证明j=i时命题亦成立。

 归纳步骤:根据归纳假设,第i-1层上至多有2i-2个结点。由于二叉树的每个结点至多有两个孩子,故第i层上的结点数至多是第i-1层上的最大结点数的2倍。即j=i时,该层上至多有2×2i-2=2i-1个结点,故命题成立。

性质2 深度为k的二叉树至多有2k-1个结点(k≥1)。

证明:在具有相同深度的二叉树中,仅当每一层都含有最大结点数时,其树中结点数最多。因此利用性质1可得,深度为k的二叉树的结点数至多为:

20+21+…+2k-1=2k-1

故命题正确。

性质3 在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则no=n2+1。

证明:因为二叉树中所有结点的度数均不大于2,所以结点总数(记为n)应等于0度结点数、1度结点(记为n1)和2度结点数之和:

n=no+n1+n2 (式子1)

     另一方面,1度结点有一个孩子,2度结点有两个孩子,故二叉树中孩子结点总数是:

nl+2n2

  树中只有根结点不是任何结点的孩子,故二叉树中的结点总数又可表示为:

n=n1+2n2+1 (式子2)

  由式子1和式子2得到:

no=n2+1

时间: 2024-10-06 19:40:59

【数据结构和算法】:树和二叉树定义、基本术语和性质的相关文章

数据结构和算法 (二)数据结构基础之树、二叉树

Java面试宝典之二叉树的实现 我们接着上一篇数据结构继续讲解.本章系数据结构之树与二叉树,从这章开始,我们就要介绍非线性结构了,这些内容理解起来比线性表稍难一些,我尽量写的通俗一些,如果读的过程中有任何问题,请按上述方式联系我! 一.树 树 形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树结构在客观世界中是大量存在的,例如家 谱.行政组织机构都可用树形象地表示.树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结

数据结构与算法的学习-二叉树

二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要.    二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成.    这个定义是递归的.由于左.右子树也是二叉树, 因此子树也可为空树. 二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历

数据结构实践项目——树和二叉树(1)

本文针对[数据结构基础系列(6):树和二叉树]第1-10课时 1 树结构导学 2 树的基本概念 3 树的基本术语 4 树的性质 5 树的存储结构 6 二叉树概念和性质 7 二叉树与树.森林之间的转换 8 二叉树的存储结构 9 二叉树的基本运算及其实现 10 二叉树的遍历 [项目1 - 二叉树算法库] 定义二叉树的链式存储结构,实现其基本运算,并完成测试. 要求: 1.头文件btree.h中定义数据结构并声明用于完成基本运算的函数.对应基本运算的函数包括: void CreateBTNode(BT

数据结构与算法(c++)——查找二叉树与中序遍历

查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) #include <queue> class BinarySearchTree { private: struct Node { int value; Node* left; Node* right; }; Node* root; void insert(Node*, int); void trav

数据结构实践项目——树和二叉树(2)

本文针对数据结构基础系列(6):树和二叉树第7, 11-15课时 7 二叉树与树.森林之间的转换 11 二叉树遍历非递归算法 12 层次遍历算法 13 二叉树的构造 14 线索二叉树 15 哈夫曼树 [项目1 - 二叉树算法验证] 运行并重复测试教学内容中涉及的算法.改变测试数据进行重复测试的意义在于,可以从更多角度体会算法,以达到逐渐掌握算法的程度.使用你的测试数据,并展示测试结果,观察运行结果,以此来领会算法. (1)层次遍历算法的验证 [参考链接] (2)二叉树构造算法的验证 [参考链接]

数据结构与算法----树(下)

  大家好,今天继续学习树的数据结构.在上一章,我们讲树的孩子兄弟表示法时,提到了二叉树.今天,我们就来学习二叉树的相关性质.  一.二叉树定义: 二叉树(Binary Tree):n(n≥0)个结点的有限集合,该集合或者为空集(为空时,称为空树),或者由一个根结点.两棵互不相交.称为根结点的左子树.右子树的二叉树组成.(Note:大家注意了,我们在给出二叉树定义时,我们利用了递归概念.就是先给出二叉树概念,再用二叉树概念去解释二叉树.递归是一种很重要的方法,在数据结构中是很重要的,我们会在后面

基本数据结构学习笔记——树与二叉树

1.树的形式化定义: 树(Tree)是由一个或多个结点组成的有限集合T,其中有一个特定的称为根的结点:其余结点可分为m(m≥0)个互不相交的有限集T1,T2,T3 ,…,Tm,每一个集合本身又是一棵树,且称为根的子树. 2.有关树的基本术语: 1.结点(Node):树中的元素,包含数据项及若干指向其子树的分支. 2.结点的度(Degree):结点拥有的子树数. 3.结点的层次:从根结点开始算起,根为第一层. 4.叶子(Leaf):度为零的结点,也称端结点. 5.孩子(Child):结点子树的根称

数据结构与算法-&gt;树

代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 目录 一. 2-3-4树的定义 二. 2-3-4树的可以得到几个推论 三. 2-3-4树数据结构定义 四. 2-3-4树节点相关方法定义与解释 五. 2-3-4树查找逻辑解释和代码实现 六. 2-3-4树插入逻辑解释和代码实现 一. 2-3-4树的定义

数据结构与算法分析-树、二叉树、二叉查找树

作者:xiabodan 出处:http://blog.csdn.net/xiabodan 二叉树 二叉树的申明: struct node { int data; struct node *left; struct node *right; }; 新建一个节点 /* newNode() allocates a new node with the given data and NULL left and right pointers. */ struct node* newNode(int data