树-二叉树
文章平均质量分 69
此专栏为树和二叉树的面试高频算法题
Java大数据运动猿
努力提升自己,记录学习过程。巩固自己,帮助他人!
展开
-
98. 验证二叉搜索树【68】
给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。原创 2023-05-05 10:44:49 · 201 阅读 · 1 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点【37】
给定一棵二叉搜索树,请找出其中第k大的节点的值。原创 2023-05-03 11:56:26 · 623 阅读 · 0 评论 -
226. 翻转二叉树【58】
给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。原创 2023-05-03 11:21:14 · 478 阅读 · 0 评论 -
543. 二叉树的直径【71】
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。原创 2023-05-03 10:38:55 · 645 阅读 · 0 评论 -
199. 二叉树的右视图【111】
既然是站在右边看树,那么我们看到的结点都是每一层的最右边的结点,这个节点可能在根的右子树上,也可能在根的左子树上。所以,我们可以递归遍历树,使用深度优先算法,按照【根节点 ->右子树 -> 左子树】的顺序访问。同时设置一个depth变量,如果depth的值与res集合中的元素数量相等的话,就说明当前被遍历到的这个节点没有放在res中,所以将这个节点的值放到res中,同时每遍历一层就加一,这样就能知道树的深度,也可以保证每一层只有一个节点可以放入res中,这样就可以保证每层都是最先访问最右边的结点原创 2023-05-02 14:45:19 · 645 阅读 · 0 评论 -
递归思路讲解
最近刷到了树这一模块的算法题,树相关的算法题几乎都是用递归来实现的,但递归的思路却有点抽象,每次遇到递归,都是通过递归来深度或广度地遍历树,但对于递归遍历树的遍历路线,却有点抽象难懂,不知道遍历的路线是怎么样的,也对于返回的路线有点懵懂。虽然知道是用递归,也知道递归可以一层一层从上到下地遍历,大体上的一个遍历路线是明白的,但是真要将递归一层层拆解分析的话,我还是有点不知所措的,所以今天研究了一小时,彻底将递归的一层层遍历拆解分析透彻了。记录一下拆解分析的过程,以防之后又忘了,方便回顾。原创 2023-05-02 14:26:27 · 816 阅读 · 0 评论 -
236. 二叉树的最近公共祖先【190】
自顶向下遍历,用递归的方法,这里找到公共祖先分为两种情况:1.p 和 q 在公共结点的两侧,则当前结点就是公共结点2.公共结点为p 或 q 中的任何一个,另一个则为公共结点的子节点,那么p 或 q 则是公共结点。代码思路:(1)先判断root是否为null,或者root 为p 或 q中的任意一个,那么直接返回root,这里的root放在递归的时候就是当前结点。(root为null有两种情况,一种是树为null,第二种是叶子结点为null,也就是遍历完了,也没找到目标值)(2)既然p原创 2023-04-26 13:28:35 · 393 阅读 · 0 评论 -
103. 二叉树的锯齿形层序遍历【191】
本题的解决思路和102. 二叉树的层序遍历【206】类似,可以说思路基本一样,只是在一个细节的地方不一样。遍历完一层后,添加元素到链表中,可以选择添加到链表尾部还是头部,偶数层的话(即0、2、4)就添加到尾部,这样就是从左到右遍历;奇数层的话(即1、3、5)就添加到头部,这样就相当于从右往左遍历。实现锯齿形层序遍历的方法,本质上其实就是在添加元素的时候选择插入到链表尾部还是头部。具体思路:1.按层数的奇偶来决定每一层的输出顺序。规定二叉树的根节点为第0层,如果当前层数是偶数,从左至右输出原创 2023-04-23 14:42:36 · 558 阅读 · 0 评论 -
104. 二叉树的最大深度【75】
深度优先:一棵树的深度 = max(左子树的深度,右子树的深度)+1也就是左子树和右子树的深度取最大的,再加1,就等于当前结点的深度。那么,根据这个思想,我们可以用递归的方式,分别递归左子树和右子树,依次递归下去,就得到了树的深度。代码思路:(1)先判断树是否为null,为null返回0(2)树不为null的话,分别递归左子树、右子树,最终return max(左子树的深度,右子树的深度)+1原创 2023-04-23 13:24:23 · 398 阅读 · 0 评论 -
101. 对称二叉树【74】
递归解法:思路:如果一个树的左子树和右子树都是对称的,那么这个树就是对称的。所以用递归的方式,深度进行层层遍历比较,一棵子树一棵子树的遍历;两个数对称需要满足以下两种情况:(1)它们的两个根节点具有相同的值(2)每个树的右子树都与另一个树的左子树对称代码思路:实现一个递归函数,通过传入两个指针的方法来遍历这棵树,p指针和q指针一开始都指向这棵树的根,随后p右移时,q左移,p左移时,q右移。每次检查当前p和q结点的值是否相等,如果相等在判断左右子树是否对称。原创 2023-04-22 11:23:41 · 65 阅读 · 0 评论 -
110. 平衡二叉树【75】
自底至顶:思路是对二叉树做先序遍历,从底至顶返回子树的最大高度,若判定某子树不是平衡树则“剪枝”,直接向上返回。(判断子树是否满足平衡,子树不满足则直接返回,若子树满足,则继续向上比较,用递归的方式依次类推,直到判断根节点的左右子树是否满足平衡。)算法流程:递归返回值:(1)当结点 root 的左/右子树的高度差原创 2023-04-22 10:08:11 · 218 阅读 · 0 评论 -
145. 二叉树的后序遍历【34】
后序遍历:左节点-->右节点-->根节点后序遍历方法的代码实现:1.先判断树是否为null2.后序遍历就先对左子树、右子树依次分别递归调用,再将根节点添加到list中原创 2023-04-21 11:08:47 · 484 阅读 · 0 评论 -
94. 二叉树的中序遍历【119】
中序遍历:左节点-->根节点-->右节点中序遍历方法的代码实现:1.先判断树是否为null2.中序遍历就是先递归左子树,再将根节点添加到list中,最后再递归右子树原创 2023-04-21 11:05:31 · 135 阅读 · 0 评论 -
144. 二叉树的前序遍历【78】
前序遍历:根节点-->左节点-->右节点前序遍历方法的代码实现:1.先判断树是否为null2.前序遍历就先将根节点添加到list中,再对左子树、右子树依次分别递归调用原创 2023-04-21 11:05:28 · 131 阅读 · 0 评论 -
102. 二叉树的层序遍历【206】
1.先判断这个树是否为空,为空则直接返回。2.树不为空,我们将根节点放入一个队列中,然后每次取出这个节点后,相应的将他的左右子节点依次放入队列中,按照队列的先进先出的特性,依次将元素出队列。(难理解可以画图感受一下)原创 2023-04-21 09:56:48 · 464 阅读 · 0 评论