首页 > 其他分享 >数据结构之树(二叉树)

数据结构之树(二叉树)

时间:2023-10-29 15:44:20浏览次数:34  
标签:左子 结点 右子 节点 之树 二叉树 数据结构 链接

什么是二叉树(binary tree)?

在树结构的基础上,要求其中每个节点最多有两个子节点(一个节点最多有2个边)。

二叉树由根节点和若干个左子树和右子树构成,这些子树也都是二叉树。二叉树可以为空树,也可以只包含一个根节点。

为什么树形结构常用二叉树呢?

就是为了省空间。n叉树,n越大就需要更多的链接建立节点与子节点的关系。推导如下:

树结构一般使用链表(Linked List)存储,对于n叉树(n-way树),虽然每个节点的度数不可能都是n,但每个节点必须预留n个链接,用于建立父子节点关系。因此每个节点的数据结构如下:

 这种n叉树十分浪费链接存储空间。

假设此n叉树有m个节点,那么此书需要n*m个链接/指针(每个节点都必须拥有n个链接)。除了根节点以外,每个非空链接都指向一个节点(有m-1个节点就有m-1节点链接/指针,这些链接没有浪费即为非空链接),得知空链接总数为n * m  - (m - 1) = m(n-1) + 1,而n叉树的链接浪费率为 m(n-1) + 1除以n * m。因此可以得到结论:

1.  n=2时,2叉树的链接浪费率为(m+1)/ 2m,浪费率约为二分之一

2.  n=3时,3叉树的链接浪费率为(2m+1)/ 3m,浪费率约为三分之二

3.  n=4时,4叉树的链接浪费率为(3m+1)/ 4m,浪费率约为四分之三

……

因此得到n=2时即2叉树的链接浪费率最低,因此常使用二叉树来取代其他树结构。

 

二叉树与一般树的不同之处

1. 是否可以是空结合:树不可以为空集合,但二叉树可以为空集合

2. 度数的范围:树的度数范围是大于等于0,而二叉树大于等于0且小于等于2

3. 子树关系:树的子树间没有次序关系,而二叉树有(主要涉及插入顺序、遍历顺序、搜索和排序)

二叉树涉及的数学证明

1. 高度为k的二叉树的总节点数是2k-1(最多),其中k大于等于1

为了实现总结点最多,每一层都挂满子节点

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

https://i.cnblogs.com/posts/edit-done;postId=17795378;isPublished=false

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

因为是二叉树,一个节点最多有2个子节点,除了第1层根节点是1个。其他层节点最多都是2的倍数。即

第1层:20

第2层:21

第3层:22

……

第i层:2i-1

 3. 在任意-棵二叉树中,若终端结点(叶子节点)的个数为n0,度为2的结点数为n2,则no=n2+1。

推导过程:

假设

  1. 叶子节点数:n0

  2. 度数为1的节点数:n1

  3. 读数为2的节点数:n2

  4. 总节点数:n

        5. 二叉树的总边数:e

从节点数得到:n=n0 +  n+ n2

已知边数与节点数关系:n=e+1

 

边数与度数为2、1、0节点的关系:

  1. 一个度数为2的节点有2个边,  n2个有2n2个边。

  2. 一个度数为1的节点有1个边, n1个有 n1个边。

  3. 度数为0的节点,没有边。

从而得到结论: e= 2n+  n1

进而得到 n=n0 +  n+ n= e +1 = 2n+  n1 + 1  ==> no=n2+1

特殊情形

满二叉树

除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。

 完全二叉树

完全二叉树是满二叉树的一个特例

 

完全二叉树(Complete Binary Tree):假设二叉树的高度为h。除第h层外,其它各层(0~h-1)的结点数都达到最大个数(2k-1),第h层从右向左连续缺若干结点,这就是完全二叉树

上述所说从右向左缺若干节点,也就是说在h层的时候,如果有节点都在左半边,而缺的都是右半边的节点,这就是完全二叉树!

BST树(二叉搜索树)

 

对于树上的每个节点来说,其左孩子的节点比双亲节点小,其右孩子的节点比双亲结点大,移除根节点,形成的左子树和右子树也都按照这个规则排序。

平衡二叉搜索树(AVL树)

两子树高度相差不超过1的搜索二叉树即为平衡搜索二叉树

 

对称二叉树(Symmetric Binary Tree)

对称二叉树(Symmetric Binary Tree)是一种特殊的二叉树,其中树的结构呈现对称性。这意味着,树的根节点具有两个子节点,这两个子节点的结构是镜像对称的,它们的左子树是对方右子树的镜像,而右子树是对方左子树的镜像。这就意味着树从根节点开始向下延伸,左子树和右子树的结构是对称的。

 

在这个示例中,树的根节点是1,左子树是以2为根的子树,右子树也是以2为根的子树。而且,这两个子树的结构是镜像对称的,它们的左子树和右子树也是镜像对称的。这使得整个二叉树成为一个对称二叉树。

对称二叉树在编程和数据结构中经常出现,通常用于解决一些与对称性相关的问题。在验证一个二叉树是否是对称二叉树时,通常可以使用递归算法或迭代算法来检查树的左子树和右子树是否镜像对称。

 

标签:左子,结点,右子,节点,之树,二叉树,数据结构,链接
From: https://www.cnblogs.com/allenxx/p/17795361.html

相关文章

  • NOIP[区间数据结构类问题]
    平面最近点对经典的分治问题,把所有的点按照\(x\)排序,然后分治处理两个子区间,然后枚举离中心少于已知最小值的点,判断能否出现更小值。intn,temp[250000];structnode{ intx,y;}a[500500];boolcmp(nodel,noder){ if(l.x==r.x)returnl.y<r.y; returnl.x<r.x;}doub......
  • 【数据结构】- 并查集
    并查集简介并查集是可以维护元素集合的数据结构。并查集通过把一个集合作为一棵树的方式,维护一个森林(这暗含并查集可以维护连通块个数,如在kruskal中,通过并查集维护连通块个数就能快速判断循环退出条件),并使用树的根节点代表各集合。这样一棵树的节点就对应该集合中的元素......
  • C++---数据结构---队列(queue)
    queue容器queue基本概念概念:Queue是一种先进先出(FirstInFirstOut,FIFO)的数据结构,它有两个出口队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为—入队push队列中出数据称为—出队popque......
  • 数据结构之栈和队列
    一:物理结构和逻辑结构除了数组和链表之外,常用过的数据结构还有很多,但大对数* 都以数组或链表作为存储方式。数组和链表可以被看作数据存储* 地‘物理结构“**什么是数据存储的物理结构呢?*如果把数据结构比作活生生的人,那么物理结构就是人的血肉*和骨骼,看得见,摸得着,实......
  • 重学递归思想,体悟数据结构奥妙
       说来好笑,暑假一腔热血想进acm,在学插入排序,归并排序这两个玩意,耗费了我整整一个星期都没搞懂,一度让我想放弃,觉得自己刚开始学算法就被打败了,不配coding了,后面请教别人,才发现里面有个递归思想我还不会,所以很痛苦。。。暑假结束了,递归我还没那么懂,今天来复仇了     ......
  • Python数据结构——链表
    链表(LinkedList)是一种基本的数据结构,用于组织和管理数据。它是由一系列节点(Node)组成的数据结构,每个节点包含一个数据元素和指向下一个节点的引用。链表是一种非线性数据结构,与数组不同,它可以根据需要动态分配内存。什么是链表?链表是由节点组成的数据结构,每个节点包含两部分:数据元......
  • 数据结构与算法(LeetCode) 第二节 链表结构、栈、队列、递归行为、哈希表和有序表
    一、链表结构1.单向链表节点结构publicclassNode{ publicintvalue;publicNodenext;publicNode(intdata){value=data;}}2.双向链表节点结构publicclassDoubleNode{publicintvalue;publicDoubleNodelast;publicDouble......
  • 数据结构与算法(LeetCode)第一节:认识复杂度,对数器,二分法与异或运算
    一、认识复杂度1.评估算法优劣的核心指标:时间复杂度:当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉,记为O(去掉系数的高阶项);​ 时间复杂度是衡量算法流程的复杂度的一种指标,该指标只与数据量有关,与过程之外的优化无关常见的时间复杂度(从好到坏)O......
  • [考研] 数据结构
    针对数据结构的部分学习笔记。栈出栈排列个数:\(C_{2n}^n\),卡特兰数栈模拟中缀转后缀原理:中缀转后缀的原理是单调栈(维护一个优先级递增的栈),从栈底到栈顶的优先级必然递增,输出时可以保证优先级高的先输出(出栈)。中缀表达式和后缀表达式的不同仅在于符号位置不同,数字之间相......
  • 评论功能的选择难题:数据结构如何选定?
    尊敬的小伙伴们,大家好!我是小米,一个热爱技术、热衷分享的90后程序员。今天,我要和大家一起探讨一个在软件开发中常见,却又充满深度的话题——"面试题:评论功能采用什么数据结构?"。在这个数字化时代,几乎每个应用程序都需要实现评论功能。无论是社交媒体、电子商务网站还是新闻阅读应用,评......