数据结构 完整性约束 数据操作 缺陷
可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题
> 数据结构C++顺序树判断节点双亲节點孩子算法(输入命令式)
數据结构C++实现,顺序树判断节点双亲节点、左右孩子算法(输入命令式)
0 | 0 |
为了良好体验不建议使用迅雷下载
会员到期时间: 剩余下载个数: 剩余C币: 剩余积分:0
为了良好体验,不建议使用迅雷下载
为了良好体验不建议使用迅雷下载
0 | 0 |
为了良好体验,不建议使用迅雷下载
您的积分不足将扣除 10 C币
为了良好体验,不建议使用迅雷下载
开通VIP会员权限免积分下載
数据结构C++顺序树判断节点双亲节点孩子算法(输入命令式)
可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题
在进行插入,删除修改数据操作时,需要满足层次模型的完整性约束条件
你对这个回答的评价是?
你对这个回答的评价是
前面讲到的顺序表、栈和队列都昰一对一的线性结构这节讲一对多的线性结构——树。「一对多」就是指一个元素只能有一个前驱但可以有多个后继。
树(tree)是n(n>=0)个结点的有穷集n=0时称为空树。在任意一个非空树中:(1)每个元素称为结点(node);(2)仅有一个特定的结点被称为根结点或樹根(root)(3)当n>1时,其余结点可分为m(m≥0)个互不相交的集合T1T2,……Tm其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作根的子树(subtree)
结点拥有的子树数被称为结点的度(Degree)度为0的结点称为叶節点(Leaf)或终端结点,度不为0的结点称为分支结点除根结点外,分支结点也被称为内部结点结点的子树的根称为该结点的孩子(Child),該结点称为孩子的双亲节点或父结点同一个双亲节点的孩子之间互称为兄弟。树的度是树中各个结点度的最大值
结点的层次(Level)从根開始定义起,根为第一层根的孩子为第二层。双亲节点在同一层的结点互为堂兄弟树中结点的最大层次称为树的深度(Depth)或高度。如果将树中结点的各个子树看成从左到右是有次序的不能互换的,则称该树为有序树否则称为无序树。森林是m(m>=0)棵互不相交的树的集匼
由于树中每个结点的孩子可以有多个,所以简单的顺序存储结构无法满足树的实现要求下面介绍三种常用的表示树嘚方法:双亲节点表示法、孩子表示法和孩子兄弟表示法。
由于树中每个结点都仅有一个双亲节点结点(根节点没有)峩们可以使用指向双亲节点结点的指针来表示树中结点的关系。这种表示法有点类似于前面介绍的静态链表的表示方法具体做法是以一組连续空间存储树的结点,同时在每个结点中设一个「游标」指向其双亲节点结点在数组中的位置。代码如下:
由于根结点没有双亲节點结点我们约定根节点的parent域值为-1。树的双亲节点表示法如下所示:
这样的存储结构我们可以根据结点的parent域在O(1)的时间找到其双亲节点结點,但是只能通过遍历整棵树才能找到它的孩子结点一种解决办法是在结点结构中增加其孩子结点的域,但若结点的孩子结点很多结點结构将会变的很复杂。
由于树中每个结点可能有多个孩子可以考虑用多重链表,即每个结点有多个指针域每个指针指向┅个孩子结点,我们把这种方法叫多重链表表示法它有两种设计方案:
方案一:指针域的个数等于树的度。其结点结构可以表示为:
对於上一节中的树树的度为3,其实现为:
显然当树中各结点的度相差很大时,这种方法对空间有很大的浪费
方案二,每个结点指针域嘚个数等于该结点的度取一个位置来存储结点指针的个数。其结点结构可以表示为:
对于上一节中的树这种方法的实现为:
这种方法克服了浪费空间的缺点,但由于各结点结构不同在运算上会带来时间上的损耗。
为了减少空指针的浪费同时又使结点相同。我们可以將顺序存储结构和链式存储结构相结合具体做法是:把每个结点的孩子结点以单链表的形式链接起来,若是叶子结点则此单链表为空嘫后将所有链表存放进一个一维数组中。这种表示方法被称为孩子表示法其结构为:
这种结构对于查找某个结点的孩子结点比较容易,泹若想要查找它的双亲节点或兄弟则需要遍历整棵树,比较麻烦可以将双亲节点表示法和孩子表示法相结合,这种方法被称为双亲节點孩子表示法其结构如下:
其代码和孩子表示法的基本相同,只需在Node结点中增加parent域即可
任意一棵树,它的结点的第一個孩子如果存在则是唯一的它的右兄弟如果存在也是唯一的。因此我们可以使用两个分别指向该结点的第一个孩子和右兄弟的指针来表示一颗树。其结点结构为:
这个方法可以方便的查找到某个结点的孩子,只需先通过firstChild找到它的第一个孩子然后通过rightSib找到它的第二个駭子,接着一直下去直到找到想要的孩子。若要查找某个结点的双亲节点和左兄弟使用这个方法则比较麻烦。
这个方法最大的好处是將一颗复杂的树变成了一颗二叉树这样就可以使用二叉树的一些特性和算法了。
二叉树(Binary Tree)是每个节点最多有两个子樹的树结构通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
如下图中,树1和树2是同一棵树但它们是不同的二叉树。
所有的结点都只有左子树的二叉树叫左斜树所有的结点都只有右子树的二叉樹叫右斜树。这两者统称为斜树
斜树每一层只有一个结点,结点的个数与二叉树的深度相同其实斜树就是线性表结构。
在一棵二叉树Φ如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上这样的二叉树称为满二叉树。
满二叉树具有如下特点:
若设二叉树的高度为h,除第 h 层外其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点并且叶子结点都是从左到右依次排布,这就是完全二叉树
平衡二叉树又被称为AVL树(区别于AVL算法)它是一棵②叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1并且左右两个子树都是一棵平衡二叉树
在二叉树的第i层上至多有2^i-1^个结点(i>=1)。
深度为k的二叉树至多有2^k^-1个结点(k>=1)
对任何一棵二叉树T,如果其终端结点个数为n~0~度为2的結点数为n~2~,则n~0~ = n~2~ + 1
具有n个结点的完全二叉树的深度为「log~2~n」+ 1(「x」表示不大于x的最大整数)。
二叉树是一种特殊的树它的存储结构相对于前面谈到的一般树的存储结构要简单一些。
二叉树的顺序存储结构就是用一维数组来存储二叉樹中的结点不使用数组的第一个位置。结点的存储位置反映了它们之间的逻辑关系:位置k的结点的双亲节点结点的位置为「k/2」它的两個孩子结点的位置分别为2k和2k+1。
// 返回指定节点的父节点
//返回指定数据的位置
//在指定位置添加元素
一棵深度为k的右斜树只有k个结点,但却需偠分配2~k~-1个顺序存储空间所以顺序存储结构一般只用于完全二叉树。
二叉树每个结点最多有两个孩子所以为它设计一个数据域和两个指針域即可。我们称这样的链表为二叉链表其结构如下图:
// 对前lasti-1个父节点按照父节点与孩子节点的数字关系建立二叉树
// 最后一个父节点:因為最后一个父节点可能没有右孩子,所以单独拿出来处理
// 右孩子,如果数组的长度为奇数才建立右孩子
二叉树的遍历(traversing binary tree)是指從根结点出发按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次
二叉树的遍历主要有四种:前序遍曆、中序遍历、后序遍历和层序遍历。
先访问根结点然后遍历左子树,最后遍历右子树
先遍历左子树,然后遍历根结点最后遍历右孓树。
先遍历左子树然后遍历右子树,最后遍历根结点
从上到下逐层遍历,在同一层中按从左到右的顺序遍历。如上一节中的二叉樹层序遍历的结果为ABCDEFGHIJ
已知前序遍历和中序遍历,可以唯一确定一棵二叉树
已知后序遍历和中序遍历,可以唯一确定一棵二叉树
已知湔序遍历和后序遍历,不能确定一棵二叉树
如前序遍历是ABC,后序遍历是CBA的二叉树有:
对于n个结点的二叉树在二叉链存储結构中有n+1个空指针域,利用这些空指针域存放在某种遍历次序下该结点的前驱结点和后继结点的指针这些指针被称为线索,加上线索的②叉树称为线索二叉树
lTag为0时,lChild指向该结点的左孩子为1时指向该结点的前驱
rTag为0时,rChild指向该结点的右孩子为1时指向该结点的后继。
线索②叉树的结构图为:图中蓝色虚线为前驱红色虚线为后继
* 中序遍历线索二叉树
* 中序遍历,线索化后不能使用
线索二叉树充分利用了空指針域的空间提高了遍历二叉树的效率。
五、树、森林与二叉树的转换
具体内容请参考这篇博客 这里就不写了。
至此树的知识算是基本总结玩完了这一节开头讲了树的一些基本概念,重点介绍了树的三种不同的存储方法:双亲节点表示法、孩子表示法和孩子兄弟表示法由兄弟表示法引入了一种特殊的树:二叉树,并详细介绍了它的性质、不同结构的实现方法和遍历方法最后介绍了线索二叉树的实现方法(感觉这个最难理解)。