首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二叉树的遍历(及层级)

什么是二叉树? 简单介绍下,二叉树是一种典型的树状结构。如它名字所描述的那样,二叉树是每个节点最多有两个子树的树结构,通常子树被称作“子树”子树”。如下图。...二叉树如何遍历? 二叉树的基本遍历方式有4种,即前序遍历、中序遍历、后序遍历以及层序遍历。...> ,所以先添加根的值 list.add(root.val); //递归查询先添加节点 getNodeVal(list, root.left); //递归查询先添加节点...); } 后序遍历 按照 孩子-> 孩子 -> 根节点 的方式遍历,每次先遍历孩子,遍历结果为 4 5 2 6 7 3 1;直接上代码。...} return listResult; } 以上就是4种基本的遍历方式,看到这里大家是不是发现,所谓的就是前中后指的是根结点的位置,层级遍历这种思路也可以应用在查询二叉树的深度

26510
您找到你想要的搜索结果了吗?
是的
没有找到

二叉树的遍历 → 不用递归,还能遍历吗

二叉树节点定义类似如下 value 存储数据, left 指向左子树, right 指向右子树   二叉树结构类似如下   二叉树的遍历分两种:深度遍历 广度遍历   深度遍历又分三种:先序遍历...、中序遍历、后续遍历,其中先序、中序、后续都是基于根(父)节点     先序遍历:根(父)节点 -> 子树 -> 子树     中序遍历:子树 -> 根(父)节点 -> 子树     后续遍历:...子树 -> 子树 -> 根(父)节点   广度遍历也指层次遍历,从下至上或从下至上一层一层的从遍历   基于上图中的二叉树,我们来看看各种遍历的结果   先序遍历:a b q w t u c...,如果未明确指明,都是从遍历   广度遍历不满足递归的条件(至于是什么条件,自行去查),所以没法用递归处理   从上至下层次遍历   从根节点出发,从上至下,相当于先进先出,先进先出这样的关键字,...,没有答案,全凭个人的感觉,可以通过多练题来提高这种感觉   2、二叉树遍历是解决二叉树相关问题的基础,不同的遍历可以解决不同的问题     下一篇讲二叉树相关的具体案例,届时大家结合这边文章,找一找二叉树问题的感觉

58640

一文带你读懂排序算法(三):堆排序算法

无双亲 如果i>1, 则其双亲parent (i) 是结点[i/2] 如果2i>n, 则结点i无孩子, 否则其孩子lchild (i) 是结点2i 如果2i+1>n, 则结点i无孩子, 否则其孩子...rchild (i) 是结点2i+1 特点 完全二叉树的特点:叶子结点只能出现在最下层次下层,且最下层的叶子结点集中在部。...孩子为空,孩子不为空,则该一定不是完全二叉树 如果遇到一个结点,孩子不为空,孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点 堆算法图解 堆排序的过程包括两个: 一是构建堆...],我们将如何通过堆排序完成对这个二叉树的排序呢?...a.交换:将堆顶元素9末尾元素4进行交换 b.调整:重新调整结构,使其继续满足堆定义 如何调整呢?我们步骤一进行的操作就是,针对非叶子结点,从左往右,从下到上,开始进行调整。

24320

Python 一网打尽之堆排序算法中的

通俗理解: 在满二叉树基础上,从向左删除几个叶子节点后,此时满二叉树就变成了完全二叉树。如下图,在上图满二叉树基础上从向左删除 2 个叶结点后的结构就是完全二叉树。...显然,完全二叉树的叶子结点只能出现在最下层或次下层,且最下层的叶子结点集中在部。 注意:满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。 2....二叉堆 二叉堆是有序的 完全二叉树,在完全二叉树的基础上,二叉堆 提供了有序性特征: 二叉堆 的根结点上的值是整个堆中的最小值或最大值。 当根结点上的值是整个堆结构中的最小值时,此堆称为最小堆。...最小堆中,如果新的根结点的值比子结点的值大,则子结点交换位置。如下图,在二叉堆中把 19 5 的位置进行交换。 注意:总是最小的子结点交换。...如此反复经过多次交换直到整个堆结构符合二叉堆的特性。

62620

堆排序(向下调整法,向上调整法详解)

结论:数组存储只适合完全二叉树二叉树 四、大小堆解释 堆并非是一定有序的 :孩子与孩子之间没有大小关系 大堆:在最大堆中,父节点的值总是大于或等于其子节点的值。...但是,孩子孩子之间并没有固定的大小关系。也就是说,孩子可以大于、小于或等于孩子,这都不会违反最大堆的定义。...堆可以在对数时间内完成插入删除最大(或最小)元素的操作,这是因为它不需要保持整个结构的完全排序。...但是,你可以看到孩子孩子之间的大小关系是不一致的。例如,5的孩子是2,孩子是3,而8的孩子是6,孩子是7。这里并没有规定孩子必须大于或小于孩子。...因为每次调整都涉及沿着的一条路径向下移动,而的深度为logN。 如何删除堆顶数据后插入数据?

19610

【学点数据结构算法】06-二叉堆优先队列

《【学点数据结构算法】05-》借助《小灰算法》为初入数据结构大门的朋友们带来了一场视觉盛宴。本篇,要介绍的二叉堆,同样是一种基础数据结构,但它也是一种特殊的二叉树。具体是怎么一回事呢?...所谓堆的自我调整,就是把一个不符合堆性质的完全二叉树,调整成一个堆。下面让我们以最小堆为例,看一看二叉堆是如何进行自我调整的。...经过上述几轮比较“下沉”操作,最终每一节点都小于它的孩子节点,一个无序的完全二叉树就被构建成了一个最小堆。...在数组中,在没有指针的情况下,如何定位一个父节点的孩子孩子呢? 像上图那样,可以依靠数组下标来计算。...二叉堆是一种特殊的完全二叉树,分为最大堆最小堆。 在最大堆中,任何一个父节点的值,都大于或等于它孩子节点的值。

35610

再谈堆排序:堆排序算法流程步骤透解—最大堆构建原理

图的概念以及二叉树的基本性质》这里摘取二叉树排序需要的重点部分,再过一遍二叉树概述要了解堆首先得了解一下二叉树,在计算机科学中,二叉树是每个节点最多有两个子树的树结构。...通常子树被称作“子树”(left subtree)子树”(right subtree)。二叉树常被用于实现二叉查找二叉堆。...二叉树的三个主要差别:的结点个数至少为 1,而二叉树的结点个数可以为 0中结点的最大度数没有限制,而二叉树结点的最大度数为 2的结点无之分,而二叉树的结点有之分二叉树又分为完全二叉树...,即父节点与子节点依次比较,把最大值交换到父节点以此类推,使这颗完全二叉树符合最大堆的性质建堆规律:父节点的下标 = (i-1)/ 2    例:数值7的下标为3,其父节点的下标为(3-1)/2=1;子节点的下标...,从2,12,5中找出最大值,然后2交换位置根据上面所将的二叉堆性质,分别得到分支节点2的节点节点比较三个节点,得到最大值的下标max如果该节点本身就是最大值,则停止操作将max节点与父节点进行交换重复

40930

MySQL学习17_索引B+

,其他各层的节点数目达到了最大值,且第d层所有节点从左向右连续紧密的排列的二叉树二叉树:所有层的节点数达到了最大数 平衡二叉树:当且仅当任何节点之间的两颗子树的高度差不大于1的二叉树 排序二叉树:二叉搜索...AI算法都是搜索,比如决策 的遍历 层次遍历是从上到下,从左到右遍历的方式 深度遍历的三种遍历顺序(节点一定在节点前面): 如何通过遍历结果反推的结构(必须给出中序遍历) 只有给定中序才能将...+ (1) + 9,4 + (0) + 5 + (2) + 6 子树:7,3,8 + (1) + 9,4 中根据中序的规则,7,3,8是子树,9,4为子树 根据规则,依次对应:...7根38;94中9是子树,根是4 子树:5 + (2) + 6,5是节点,6是节点 ---- 索引 索引是加速MySQL对表中数据行的高效获取而创建的一种分散存储的数据结构,正确地创建合适的索引作用是提高数据查询性能的基础...二叉查找 节点小于根节点 节点大于根节点

67020

东哥手把手带你套框架刷通二叉树|第一期

如果你告诉我,快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后续遍历,那么我就知道你是个算法高手了。 为什么快速排序归并排序能二叉树扯上关系?...[p+1..hi]都大于nums[p],然后递归地去nums[lo..p-1]nums[p+1..hi]中寻找新的分界点,最后整个数组就被排序了。...3 1 通过观察,我们发现只要把二叉树上的每一个节点的左右子节点进行交换,最后的结果就是完全翻转之后的二叉树。...我们再梳理一下,如何按题目要求把一棵拉平成一条链表?很简单,以下流程: 1、将root的子树子树拉平。 2、将root的子树接到子树下方,然后将整个子树作为子树。...二叉树题目的难点在于如何通过题目的要求思考出每一个节点需要做什么,这个只能通过多刷题进行练习了。

55020

算法渣-排序-堆排序

子树子树是有顺序的,次序不能颠倒。 即使某结点只有一个子树,也要区分左右子树。 满二叉树 所有的分支结点都存在子树子树,并且所有的叶子结点都在同一层上,这样就是满二叉树。...在上图中,1,按层次编号5结点没有子树,有子树,10结点缺失。2由于3结点没有字数,是的6,7位置空挡了。3中结点5没有子树。 ?...然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。 1. 将堆顶元素9末尾元素4进行交换 ? 2. 重新调整结构,使其继续满足堆定义 ? 3....再将堆顶元素8与末尾元素5进行交换,得到第二大元素8 ? 4. 继续进行调整,交换,如此反复进行,最终使得整个序列有序 ?...,反复执行调整+交换步骤,直到整个序列有序。

35030

数据结构+算法(第09篇):菜鸟也能“种”好二叉树

二叉树的数据结构表达 从上图可以看出,整棵其实就是一个递归结构。递归的基本单元就是节点。每个节点有三个信息: 节点本身承载的数据、节点的子节点、节点的子节点。...根据上述推论,我们发现一个重要事实: 每个节点的子节点子节点在数组中的位置是可以直接由该节点在数组中的位置决定的。...既然相互之间的位置可以直接决定,那么也就没有必要在每个节点的数据结构中保存子节点子节点的信息了,只用保留节点本身的信息node_item即可。 6....今天我们就利用满二叉树的节点与子节点位置的线性关系来巧解这道题: 反转二叉树就是递归交换左右子树,如果将整棵用数组来保存,那么这个递归交换就可以翻译成: 遍历整个数组,对每个元素,找到它的子节点所对应的数组元素...、子节点所对应的数组元素,将两者交换位置,就实现了整棵的反转。

46410

二叉树的镜像

大家好,我是程序员吴师兄,欢迎来到 图解剑指 Offer 结构化专栏,在这个专栏里我将大家一起学习如何用结构化的思维来思考、解题、写代码,希望能帮助你即使在面试的时候紧张也能做对。...规律:尝试总结出题目的一般规律特点。 匹配:找到符合这些特点的数据结构与算法。 边界:考虑特殊情况。 1、模拟 二叉树的镜像指的是对于二叉树内任意一个节点,都交换了它的左右子节点。...比如下面这颗三层七节点的二叉树,首先交换左右子树。 ? 交换后的左右子树的子节点还是保持原来的顺序,需要去交换左右子树自己的左右子树。 ?...2、规律 直接利用递归遍历二叉树交换每个节点的 / 子节点,即可生成二叉树的镜像。...TreeNode tmp = root.left; // 以下两个操作是在交换当前节点的左右子树 // 当前节点的子树为节点的子树

49450

数据结构+算法(第12篇)玩平衡二叉树就像跷跷板一样简单!

图2 非平衡二叉树 图1就是一棵平衡二叉树,而图2不是平衡二叉树。 在图2中,对于值为9的节点,它的子树为空,高度为0,子树高度为3,两者相差3,不满足平衡二叉树定义的第二条规则。 2....如何证明平衡二叉树的平均查找长度最短? 首先研究一下平衡二叉树与非平衡二叉树的关系。...遍历的时候如何方便地获取左右子树的高度? 如何交换节点的位置,使得新的高度差在1以内? 对于问题1,如果你仔细研究过笔者前几篇文章的话——《神力加身!...图5图6分别描述了一般情况。 ? 图5 ? 图6 为了解决这个“新鲜问题”,我们先来看一个引理: 引理12.1 因为任意非叶子节点A,它的值都比其孩子B的值小,所以它可以变成B的孩子。...为了节省篇幅,自底向上的、单向链表存储式、非递归型平衡二叉树调整算法自底向上的、数组存储式、非递归型平衡二叉树调整算法放在下一篇文章里单独列示。 4.

59030

算法基础--堆排序

国内的满二叉树属于完全二叉树 对于国外的满二叉树二叉树的结点要么是叶子结点,度为0,要么是度为2的结点,不存在度为1的结点。 ?...数组与完全二叉树 如果从下标从1开始存储,则编号为i的结点的主要关系为: 双亲:下取整 (i/2) 孩子:2i 孩子:2i+1 如果从下标从0开始存储,则编号为i的结点的主要关系为: 双亲:下取整...((i-1)/2) 孩子:2i+1 孩子:2i+2 这个规律,通常用来对通过指定下标取得相关节点下标。...用数组,建立大根堆二叉树 将数组中元素依次放入完全二叉树中,若大于父节点则依次比对交换。保证时刻处于大根堆排序 第i个数字被插入时排序的时间复杂度与高叉高度相等,即O(Logi)。...,需交换n-1次,而重建堆的过程中,根据完全二叉树的性质,[log2(n-1),log2(n-2)...1]逐步递减,近似为nlogn。

58550

数据结构+算法(第11篇)玩平衡二叉树就像跷跷板一样简单!

图2 非平衡二叉树 图1就是一棵平衡二叉树,而图2不是平衡二叉树。 在图2中,对于值为9的节点,它的子树为空,高度为0,子树高度为3,两者相差3,不满足平衡二叉树定义的第二条规则。 2....如何证明平衡二叉树的平均查找长度最短? 首先研究一下平衡二叉树与非平衡二叉树的关系。...遍历的时候如何方便地获取左右子树的高度? 如何交换节点的位置,使得新的高度差在1以内? 对于问题1,如果你仔细研究过笔者前几篇文章的话——《神力加身!...图5图6分别描述了一般情况。 ? 图5 ? 图6 为了解决这个“新鲜问题”,我们先来看一个引理: 引理12.1 因为任意非叶子节点A,它的值都比其孩子B的值小,所以它可以变成B的孩子。...为了节省篇幅,自底向上的、单向链表存储式、非递归型平衡二叉树调整算法自底向上的、数组存储式、非递归型平衡二叉树调整算法放在下一篇文章里单独列示。 4.

72230

数据结构小记【PythonC++版】——二叉树

一,的简介 树结构的形状很像现实生活中一棵倒置的大树。 树结构是由一堆节点边组成的具有层级关系的非线性数据结构。 树顶部的节点被称为根节点,它通常是搜索、遍历等操作的起始位置。...2.有些的每个节点的子节点之间可以是无序的,两个子节点之间甚至可以交换位置。而(有序)二叉树中,每个节点的子节点之间需要区分是子节点还是子节点,即使整棵就两个节点。...四,二叉树的常见表示方式 方式一,链式存储——用链表结构来表示二叉树 此时的二叉树被视为节点的集合。 链表节点的构成: 指针,指向节点的子节点的指针。...中的节点数决定了数组的大小。 数组的第一个位置存储根节点。 如果一个节点存储在第i位置,那么它的子节点子节点分别存储在第2i第2i+1位置。...二叉树的深度优先遍历,先将分为三个部分即根节点、子树子树,由此生成了三种遍历方式: 方式1.前序遍历: step.01:处理根节点。 step.02:移动到子树并递归遍历。

34520

C语言二叉树的实现

C,BC的父节点是A 堂兄弟:D的堂兄弟是EF 根据上面的概念上面对的定义你应该知道这是一个二叉树。...由于二叉树的广泛应用与研究,所以这里我们讨论二叉树,其实森林一般都可以转化为一个一般,转换原则就是把一个节点的第一个子节点变成二叉树节点,然后其他堂兄弟就是节点,这句话不指望你能看懂,因为我都感觉没有表述清楚...,我认为这个视频讲得比较好http://pan.baidu.com/s/1i3yYd2t 然后我们再细分二叉树,它分为: 空二叉树:就是什么都没有 满二叉树:每个节点都有两个子节点 完全二叉树:把一颗完全二叉树的最后一层从往左删除一些节点得到的就是完全二叉树...*rchild; }; 这样我们就定义了一个简单的二叉树节点,它包含一个数据域两个指针域,两个指针域分别用来指向左孩纸(节点)孩纸(节点),然后再看看这图,我们接下来将定义一个如图所示的二叉树...接下来就是中序遍历,中序遍历就是先遍历节点,然后遍历根,最后节点,所以遍历顺序就是DBAGECF 最后是后序遍历,后序遍历是先遍历节点然后节点最后根,所以遍历顺序是DBGEFCA 这里看似很麻烦

1.7K20

【初阶数据结构】——写了将近 5 万字,终于把 二叉树 初阶的内容讲清楚了

2.1 概念 一棵二叉树是结点的一个有限集合,该集合: 或者为空 或者由一个根节点加上两棵别称为子树子树的二叉树组成 由上图我们可以得出: 二叉树不存在度大于2的结点 二叉树的子树有左右之分...二叉树的链式结构及实现 5.1 二叉树的链式结构 首先再回顾下二叉树的概念,二叉树是: 一棵二叉树是结点的一个有限集合,该集合: 或者为空 或者由一个根节点加上两棵别称为子树子树的二叉树组成...: 1 2 3 NULL NULL 现在3整个访问完了,相当于2的子树完了,然后是2的子树,也是空: 1 2 3 NULL NULL NULL 现在2整个访问完了,相当于1的子树完了,然后是...,那子树同样可以看成一棵二叉树分成根,子树子树。...来验证一下: 5.4 求叶子结点个数 接下来我们再来看一个问题,如何求一棵二叉树的叶子结点的个数? 首先回顾一下,啥是叶子结点: 那在链式结构中,就是它的指针指针都指向空的结点。

17810

剑指offer代码解析——面试题19二叉树的镜像

我们可以画一棵二叉树,然后画出该二叉树的镜像。画完图之后我们会发现,所谓“二叉树的镜像”就是把二叉树中所有子树的孩子孩子进行交换。...因此需要遍历二叉树所有的结点,在遍历的同时交换非叶子结点的左右子树。...首先,我们需要构造二叉树的结点类,一个结点中包含一个数据域data、一个孩子left、一个孩子right,代码如下: /** * 二叉树的结点 */ class BinaryTreeNode<T...=null) binaryTreeMirror(root.right); } } 为了能够对上述算法进行测试,我编写了一个二叉树的中序遍历函数,我们可以比较二叉树镜像前镜像后的中序遍历结果来判断算法是否正确...我创建了一棵四个结点的二叉树,并且所有结点均是孩子。那么经过镜像后该二叉树的所有结点应该都是孩子。并且前后两棵的中序遍历正好是逆序关系。

68850
领券