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

【剑指 の 精选】详解「二叉树中序遍历的下一个结点」两种解法

示例: 输入:{8,6,10,5,7,9,11},8 返回:9 解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11...输入描述:输入分为2段,第一段是整体的二叉树,第二段是给定二叉树节点的值,后台会将这2个参数组装为一个二叉树局部的子树传入到函数GetNext里面,用户得到的输入只有一个子树根节点。...返回值描述:返回传入的子树根节点的下一个节点,后台会打印输出这个节点。...= null) root = root.next; // 对树进行一遍「中序遍历」,保存结果到 list 中 dfs(root); // 从 list...「中序遍历」的遍历顺序为为 「左-根-右」 可知,其父节点已经被遍历过了,我们需要递归找到符合 node.equals(node.next.left) 的节点作为答案返回,如果没有则说明当前节点是整颗二叉树最靠右的节点

67720

【数据结构初阶】链式二叉树接口实现+痛苦的OJ题

return 0; } 3.二叉树前、中、后序遍历(递归的神圣大门开启) 我们先确定一下递归的单层逻辑,逻辑很简单,如果是前序遍历,我们就输出根结点,左子树根节点,右子树根节点的值,以这样的逻辑方式递归遍历整个二叉树...对于单层逻辑的话也是比较简单的,我们将问题拆为,只拿根节点中的data和x比较看是否相等,相等我们立马返回,不相等就拿左子树根节点的data和x比较,如果还不相等,我们就继续拿右子树根节点的data和x...3.当我们计算好左子树和右子树的高度之后,我们用一个三目运算符来进行二叉树深度的返回。...//1.就是如果我从左边的树中找到我的右边的树了,那就递归结束了 //2.或者来root以及root的左和右子树中找了半天,到NULL了都还没找到,那递归也应该结束了 5.二叉树遍历(注意下标 i 的参数设计...) 二叉树遍历 这道题其实最大的难点就是,我们如何通过前序遍历的方式来递归创建一棵二叉树,至于后面的中序遍历二叉树,输出二叉树内容,那就是个小配菜,所以我们把重心放在如何去先序遍历字符串然后递归式的建立一棵二叉树上

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

    【数据挖掘】决策树算法简介 ( 决策树模型 | 模型示例 | 决策树算法性能要求 | 递归创建决策树 | 树根属性选择 )

    决策树模型过程 : ① 训练过程 : 使用训练集数据确定决策时使用的属性 , 确定根节点 , 内部节点 , 叶子节点 的属性划分 , 训练决策树模型 ; ② 预测过程 : 从根节点特征开始 , 根据决策树中的判定序列依次从根节点向下判定...决策树 属性划分 : 属性划分策略 : 根据一定的策略 , 确定哪个属性作为树根 , 然后每个子树 , 在确定剩余的哪个属性作为子树的树根 , 这是递归问题 ; 属性划分的算法性质 : 递归算法 ; 如何决定树根属性...决策树模型创建 : 决策树模型创建的核心就是选择合适的树根 , 将重要的属性放在树根 , 然后子树中 , 继续选择子树中重要的属性放在子树的树根 , 依次递归 , 最终得到决策结果 ( 叶子节点 ) ;...决策树创建算法 ( 递归 ) : 使用递归算法 , 递归算法分为递归操作 和 递归停止条件 ; 3 ....递归操作 : 每个步骤先选择属性 , 选择好属性后 , 根据 总树 ( 子树 ) 的树根属性划分训练集 ; ① 选择属性 : 递归由上到下决定每一个节点的属性 , 依次递归构造决策树 ; ② 数据集划分

    1.1K30

    二叉树八股文:递归改迭代通用模板

    而且我们前文 学习数据结构和算法的框架思维 特别强调过,练习递归的框架思维最好方式就是从二叉树相关题目开始刷,前文也有好几篇手把手带你刷二叉树和二叉搜索树的文章: 手把手带你刷二叉树(第一期) 手把手带你刷二叉树...前文 BFS 算法框架详解 是利用队列迭代地遍历二叉树,不过使用的是层级遍历,没有递归遍历中的前中后序之分。 由于现在面试越来越卷,很多读者在后台问我如何将前中后序的递归框架改写成迭代形式。...递归框架改为迭代 参加过我的二叉树专项训练的读者应该知道,二叉树的递归框架中,前中后序遍历位置就是几个特殊的时间点: 前序遍历位置的代码,会在刚遍历到当前节点root,遍历root的左右子树之前执行;...我们递归遍历二叉树的函数也是一样的,当函数被调用时,被压入调用栈,当函数结束时,从调用栈中弹出。...迭代解法到这里就搞定了,不过我还是想强调,除了 BFS 层级遍历之外,二叉树的题目还是用递归的方式来做,因为递归是最符合二叉树结构特点的。

    41930

    【剑指 の 精选】从宏观角度看「对称二叉树」问题

    Tag : 「剑指 Offer」、「二叉树」、「层序遍历」、「迭代」、「递归」 描述: 请实现一个函数,用来判断一棵二叉树是不是对称的。...因此,如果我们使用常规的遍历方式进行检查的话,需要对空节点有所表示。...一个朴素的做法是:使用「层序遍历」的方式进行「逐层检查」,对于空节点使用 emptyNode 进行代指,同时确保不递归 emptyNode 对应的子节点。...当且仅当两棵子树符合如下要求时,满足 “对称” 要求: 两棵子树根节点值相同; 两颗子树的左右子树分别对称,包括: a 树的左子树与 b 树的右子树相应位置的值相等 a 树的右子树与 b 树的左子树相应位置的值相等...当我们从整体层面出发考虑时,配合递归,往往能写出比常规做法要简洁得多的代码。 建议大家加深对「局部」和「整体」两种不同出发点的理解。

    31340

    如何遍历文件夹下上亿文件而不栈溢出

    序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?...当时我灵光一闪,因为当时我在温故数据结构的知识,我说这个文件夹的层次看着好呀嘛好眼熟,不就相当于一个树的结构,那我们学数据结构的时候是如何遍历节点的。...有左递归,中递归,右递归,当然这就是上面的递归方法,不是我们要找的解决方案,那么该怎么办? 看,角落里有我们经常忽视的层序遍历。...层序遍历:层序遍历就是从所在树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。...代码思路: 我们只需要使用一个list集合来存储每一个文件(夹),然后按次序读取list集合的元素,并判断如果是文件夹则把该文件夹下的所有文件(夹)追加到list集合后面,然后读取list的下一个元素以此类推

    59430

    如何遍历文件夹下上亿文件而不栈溢出

    序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?...当时我灵光一闪,因为当时我在温故数据结构的知识,我说这个文件夹的层次看着好呀嘛好眼熟,不就相当于一个树的结构,那我们学数据结构的时候是如何遍历节点的。...有左递归,中递归,右递归,当然这就是上面的递归方法,不是我们要找的解决方案,那么该怎么办? 看,角落里有我们经常忽视的层序遍历。...层序遍历:层序遍历就是从所在树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。...代码思路: 我们只需要使用一个list集合来存储每一个文件(夹),然后按次序读取list集合的元素,并判断如果是文件夹则把该文件夹下的所有文件(夹)追加到list集合后面,然后读取list的下一个元素以此类推

    1K20

    二叉树基础及实现(二,加经典OJ)

    判断一颗二叉树是否是平衡二叉树: 题目: 方法一:时间复杂度为O(N^2,N的平方);因为我们求高度自己实现的函数getHeight,是先遍历到,最后一个二叉树再逐一返回,当(isBalanced(root.left...,右边会返回-1,会破坏右边二叉树返回时的高度 所以,rightTreeHeight的值要判断;如果等于-1,就不可以向上返回 限制:(rightTreeHeight>...root = new TreeNode(preorder[preIndex]); //在中序遍历中从,前序遍历那里找到,代表所有子树的 根节点 int rootIndex...root = new TreeNode(postorder[postorIndex]); //在中序遍历中从,前序遍历那里找到,代表所有子树的 根节点 int rootIndex...二叉树后序非递归遍历实现: 这里思路也是大同小异,但是这里要定义一个,prev引用,记录一下被打印过的节点,左右cur就不会一直在,top的右边死循环了 图解: 代码: public List

    8210

    从前序与中序遍历序列构造二叉树

    前序遍历数组的第 1个数(索引为0)的数一定是二叉树的根结点,于是可以在中序遍历中找这个根结点的索引,然后把“前序遍历数组”和“中序遍历数组”分为两个部分,就分别对应二叉树的左子树和右子树,分别递归完成就可以了...下面是一个具体的例子,演示了如何计算数组子区间的边界: 建议看完本题可以再看一下中序和后序遍历构造二叉树 leetcode 106....从中序与后序遍历序列构造二叉树 方法一:在递归方法中,传入数组的拷贝(不推荐、复杂度较高) class Solution { public: TreeNode* buildTree(vector...inorder.begin()+pos+1, inorder.begin() +inorder.size()); root->right = buildTree(p2, i2); //返回当前二叉树的根节点...return root; } }; 方法二:在递归方法中,传入子数组的边界下标 边界下标的计算,大家可以参考一开始展示计算边界的图片 class Solution { public

    34020

    数据结构--二叉树遍历

    1.介绍 (1)前序遍历 前序遍历就是针对于树根而言的,就是这个树的树根是先被我们遍历的,因为这个二叉树里面划分为树根,左子树和右子树,这个前中后表示的就是这三个里面的树根的访问顺序,树根先被访问就是前序遍历...(5)二叉树的节点个数 这个地方是使用的递归的方法,如果自己没有根节点,说明这个二叉树的节点的个数是0,否则就是用递归去进行节点个数的计算; (6)二叉树树叶节点个数 这个也是分为有树根节点,没有树根节点...,以及正常的使用递归进行计算的情况,这个时候使用递归进行计算就不需要加上1,因为上面的加1表示这个要加上树根节点,但是这个地方计算的是树叶节点,所以不需要加上1; (7)二叉树的高度 这个地方是使用这个...leftheight表示这个左子树的高度,rightheight表示这个右子树的高度,这个地方其实是可以直接写到返回值里面的,但是这个地方使用的是递归,如果不进行这个临时变量的定义而是直接写到这个return...; (11)第k层的数据个数 使用递归,把下一层即k-1层的左子树和右子树节点数量的和作为这个返回值; (12)二叉树里面查找节点 这个里面就是查找某一个特定的节点,这个节点作为返回值,我们定义两个临时变量作为左子树和右子树的返回值

    9010

    算法:二叉树遍历类题目

    在任意一个非空树中:(1)每个元素称为结点(node);(2)仅有一个特定的结点被称为根结点或树根(root)。...可见树(tree)的定义本身就是迭代递归的定义。 二叉树是树中节点的度不大于2的有序树,它是一种最简单且最重要的树。 1....level).add(root.val); // 当前节点访问完之后,再使用递归的方式分别访问当前节点的左右子节点 levelHelper(res, root.left, level +...基于树的递归应用问题 由树的定义可知,树的定义是递归的,所以可以通过递归去解决一些类树的问题。使用递归解决问题一般有两种思路:1. 自顶向下。2. 自底向上。...如果题目可以在当前的任意节点就可以判断出返回的结果,则适合使用自顶向下(增加剪枝效果)。如果题目必须遍历到叶子节点后才能计算出中间值,则需要使用自底向上。

    24930

    java优先级队列(基于堆)

    二叉堆的存储结构 二叉堆是一颗完全二叉树,基于数组存储(元素都是靠左排列,数组中存储时不会浪费空间) 只有完全二叉树适合使用数组这种结构来存储, 其他的二叉树都要用链式结构 2.1.2 关于节点值...堆中根节点值 >= 子树节点中的值(最大堆,大根堆) 堆中根节点值 节点的值(最小堆,小根堆) 节点的层次和节点的大小没有任何关系,只能保证当前树中,树根是最大值。...交换 最后52上浮到最大的位置 上浮操作的终止条件: 当前已经上浮到树根 =》 这个元素一定是最大值 当前元素 节点对应的元素值,此时元素落到在正确位置 2.2.2 在堆中取出最大值(shiftDown...步骤如下: 最大堆的最大值一定处在树根节点,直接取出树根即可 需要融合左右两个子树,使得取出树根后这棵树仍然是最大堆 将堆中最后一个元素顶到堆顶,然后进行元素的下沉操作。...不断将子树调整为最大堆的时,最终走到树根时,左右子树已经全部是最大堆,只需最后下沉根节点就能的到最终的最大堆。

    72830

    【数据结构】二叉树链式结构的实现

    设二叉树的根结点所在层数为1 ,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第 2 层上的结点,接着是第三层的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历...二叉树遍历与构建都清楚了,那我们如何用代码统计二叉树的节点个数,我们想想如果二叉树的节点为空,那么个数就返回0,若不为空,就是自身节点算一个,左孩子节点个数加右孩子节点个数加1(自身),那么对于子问题也是如此求个数...K行节点个数,不返回最后一行叶子结点个数,返回任意一行节点个数 假如我返回第三行的节点个数,那在我们遍历过程中,我们如何确定节点是否是第三行那,我们有图可以过一行K减一,只要向下递归一行K减一,到目标行第三行...二叉树的深度,就是通过比较左右子树深度高的那个加一,不断递归,找到最高的深度,代码如下 这里我们要注意一下,如图第一个代码,三目操作符你会发现大的那位会多调用一次,若递归越深,效率会急速下降,所以我们可以将他们的值用临时变量来判断...5.寻找x节点 这个首先通过先序遍历遍历每个节点,找到的话返回这个节点,若没找到,返回NULL,扎到的话用临时变量接收,不能直接返回,以为在递归遍历中,你返回返回的是递归过程中上一个函数,并不能完全返回出来

    8610

    『LeetCode』#1刷题日记

    二叉树的最大深度 ✅ 题意 给你一个二叉树的根结点root,判断该树的深度(层数) 思路 递归 class Solution { public int maxDepth(TreeNode root...// 递归思路 // root的左子树 根节点为root.left 右子树根节点为root.right // 找左右子树的层数最大值...+1 (1为根节点层数) // 在各个子树递归过程中,最后一层(left==null right==null 0+1=1)返回上一层、层层加一 } }...验证二叉搜索树 ✅ 题意 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树 二叉搜索树的定义: 节点的左子树只包含 小于 当前节点的数。...✅ 题意 判断给定的二叉树是否轴对称 思路 // 对于每一层 左子树根节点val == 右子树根节点val // 同时 左子树的左孩子等于右子树的右孩子 左子树的右孩子等于右子树的左孩子 class

    18140

    二叉查找树

    一个二叉查找树就是一个二叉树,每个节点上包含有一个键一个值一个指向左节点的链接一个指向右节点的链接(这个图中的数字代表键,值没有显示)。...一个二叉树必须有一个根节点,我们首先查找这个元素是否在根节点里,如果在,ok返回就可以了;如果不在,所查找元素的key大于root的key,就去右子树中查找,小于就去左子树中查找,任何子树都有一个根,我们就可以继续这个过程...可以看到不论是查找还是插入我们都在对数级别实现了对应的操作,也都使用了递归的操作,递归实现的优点是简单易懂一目了然,但同样,非递归的实现效率要更高一些,而且jvm是对栈深有限制的,如果递归过深,stackoverflow...删除最小结点 因为二叉查找树是有序的,结点的左子树的键总是小于这个结点的键,于是从根节点开始我们不断查找结点的左子树结点,一旦一个结点的左子树为空,那么这个结点就是键最小结点。...(t.right)返回的是t的右子树删除最小结点之后的根节点,所以这一步也就是用x来代替t的位置 将x的左链接设为t.left,然后通过递归调用的返回更新各个链接,x对t的替代全部完成 public void

    51820

    二叉树的链式结构

    前序遍历思想和打印结果 思路:root结点为1的结点,向下走,1的左孩子节点为2,再向下走,到2的结点,2的结点左孩子为4,向下走,到4结点,4的结点左孩子为空,此时左孩子空节点的函数栈帧销毁,返回结点...结点进入,返回的值是1+left(结点数)+right(右节点数),首先先递归到4,左右指数都是0,此时的值就是1,返回到结点2......  ...* root);  代码实现: 思路:刚开始进入结点1,向下运行代码,递归值用一个整数接收, 用一个三目操作符,哪个子树的值大,就返回哪个结点的值加1,1表示这个结点。...,递归,当找到结点时, 根据代码返回该结点,返回该节点定义的 find ,然后继续运行代码,继续返回该  find ,直到递推到结点1,然后就得到该结点了。...设二叉树的根结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第⼀层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历

    9510

    【一天一大 lee】二叉树的后序遍历 (难度:中等) - Day20200929

    题目: 给定一个二叉树,返回它的 后序 遍历。...抛砖引玉 深度优先遍历(DFS) 二叉树的后续遍历:先遍历左子树,在遍历右子树,最后遍历子树根节点 思路 先用“很简单”的递归算法解决下吧 /** * Definition for a binary...node.right) _result.push(node.val) } dfs(root) return _result } 广度优先遍历(BFS) 迭代,先处理左右子树再处理子树根节点...== 'root') { queue.push(node) queue.push('root') // 先处理左右子树再处理子树根节点,注意处理顺序是从数组尾部开始所有先存又自身再存左子树...queue.push(node.right) if (node.left) queue.push(node.left) } else { // 遇到root则说明其前一个节点是子树根节点

    62320

    PAT 1020 Tree Traversals (25分) 解读

    第四步,右子树HMZ有三个节点,根G往左移三个位置后D必然是它的左子树的根。 第五步,观察发现,上面的过程是递归的。...该步递归的过程可以简洁表达如下: 1 确定根,确定左子树,确定右子树。 2 在左子树中递归。 3 在右子树中递归。 4 返回或者打印当前根。...但是因为 我们的序列是数组,下标是从0开始的,所以为了避免 2 * 0 = 0节点值覆盖,我们左孩子编号是 2*i+1,右孩子编号是 2*i+2,当然你可以选择让根节点编号是1,就不会有这个问题。...inorder数组中的结束位置 * post_index 当前子树树根在 postorder数组中的下标 * * 我们在递归时,每次找到的都是当前树根,然后分别去它的左右子树递归 * 所以我们增加参数...> in_end) return; int i = in_start; // post_end总是表示当前子树树根在整棵树后序遍历数组中的下标 // 找到当前子树树根在中序遍历序列中的位置

    50630

    二叉树就这么简单

    ,节点连接起来就成了树,而节点由一个数据、两个指针组成 因此,创建树实际上就是创建节点,然后连接节点 首先,使用Java类定义节点: public class TreeNode { // 左节点...如果访问有孩子的节点,先处理孩子的,随后返回 无论先中后遍历,每个节点的遍历如果访问有孩子的节点,先处理孩子的(逻辑是一样的) 因此我们很容易想到递归 递归的出口就是:当没有子节点了,就返回 因此,我们可以写出这样的中序遍历代码...,到右边的树根去 tempRoot = tempRoot.getRightNode(); }...三、查询二叉查找树相关 3.1查询树的深度 查询树的深度我们可以这样想:左边的子树和右边的字数比,谁大就返回谁,那么再接上根节点+1就可以了 ?...查找深度、查找最大值都用到了递归,递归在非线性的数据结构中是用得非常多的… 树的应用也非常广泛,此篇简单地说明了树的数据结构,高级的东西我也没弄懂,可能以后用到的时候会继续深入…

    1.1K80
    领券