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

查找二叉树的最深节点。如果多个节点位于最深层,则返回最右侧的Node。(答案在描述中)

查找二叉树的最深节点可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来实现。以下是使用DFS的方法:

  1. 定义一个变量maxDepth来记录当前最大深度,初始值为0。
  2. 定义一个变量rightMostNode来记录最右侧的节点,初始值为null。
  3. 从根节点开始进行DFS遍历,传入当前节点、当前深度和maxDepth。
  4. 在DFS函数中,首先判断当前节点是否为空,如果为空则返回。
  5. 如果当前深度大于maxDepth,则更新maxDepth为当前深度,并将rightMostNode指向当前节点。
  6. 递归遍历当前节点的左子树,深度加1。
  7. 递归遍历当前节点的右子树,深度加1。
  8. 返回rightMostNode作为结果。

以下是示例代码:

代码语言:txt
复制
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def findDeepestNode(root):
    maxDepth = 0
    rightMostNode = None

    def dfs(node, depth, maxDepth, rightMostNode):
        if not node:
            return

        if depth > maxDepth:
            maxDepth = depth
            rightMostNode = node

        dfs(node.left, depth + 1, maxDepth, rightMostNode)
        dfs(node.right, depth + 1, maxDepth, rightMostNode)

    dfs(root, 1, maxDepth, rightMostNode)
    return rightMostNode

这个算法的时间复杂度是O(n),其中n是二叉树中的节点数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据结构层次化组织 -- 树总览

以下是树主要概念和属性:树主要概念和属性节点Node): 节点是树基本单元,它包含数据元素和一个或多个指向其他节点引用。树每个元素都表示为一个节点。...分支节点至少有一个子节点。叶子节点(Leaf Node): 叶子节点是树没有子节点节点,它们位于末梢。父节点(Parent Node): 有子节点节点被称为父节点。父节点可以有多个节点。...子节点(Child Node): 子节点是直接连接到父节点节点。一个父节点可以有多个节点。层级(Level): 树每一层是一个层级。根节点位于第一层,子节点层级依次递增。...高度(Height): 树高度是从根节点最深层叶子节点层级数。它表示树深度。子树(Subtree): 子树是树任何节点及其所有后代节点形成树。子树可以是原树一部分。...森林(Forest): 森林是由多棵树组成集合。如果一个集合包含多棵树而没有根节点它被称为森林。

64550

JS算法探险之队列(Queue)

通常「基于队列来实现二叉树广度优先搜索」。 从二叉树节点开始,先把根节点放入到一个队列,然后每次从队列取出一个节点遍历。 如果节点有左右子节点分别将它们添加到队列。...因为,某个时刻,队列可能存在位于不同层节点如果不做区分的话,是无法获取到某层数据最大值 解决上述问题一个办法就是「计数」 用两个变量分别记录两层节点数目 变量current记录当前遍历这一层位于队列之中节点数量...变量next记录下一层位于队列之中节点数量 开始把根节点插入队列,把变量current初始化为1....接下来,每次从队列取出一个节点遍历 队列queue1用来存放当前遍历层节点,总是从队列queue1取出节点来遍历 如果当前遍历节点有子节点,并且子节点位于下一层,把子节点放入队列queue2...题目描述: ❝输入一课二叉树,站在该二叉树右侧,从上到下看到节点构成二叉树右侧视图。

47920
  • 数据结构与算法(3)——树(二叉、二叉搜索树)树LeetCode相关题目整理

    完全二叉树定义完全二叉树之前,假定二叉树高度为h;对于完全二叉树如果将所有结点从根节点开始从左至右,从上至下,依次编号(假定根节点编号为1),那么僵得到从1~n(n为结点总数)完整序列,遍历过程对于空指针也赋予编号...,如果所有伽椰子结点深度为h或h-1,且结点编号序列没有漏掉任何数字,那么这样二叉树叫作完全二叉树。...二叉树应用 编译器表达式树; 用于数据压缩算法赫夫曼编码树; 支持集合查找、插入和删除,其平均时间复杂度为O(lognn)二叉搜索树(BST); 优先队列(PQ),它支持以对数时间(最坏情况下...return true; } // 如果左孩子结点大于了根节点返回false if (null !...:二叉树前序遍历序列,第一个数字总是树节点值,但在序遍历序列,根节点值保存在序列中间,左子树节点位于节点左边,而右子树相反,然后既然找到了左右子树我们又可以使用同样方法在前序和序中分别构建左右子树

    1.1K20

    非线性表树、堆是干嘛用 ?其数据结构是怎样

    高度和深度是带有度字,都是从 0 开始计数。而层数计算,是和我们平时楼层计算是一样底下那层是第 1 层,是从 1 开始计数,所以根节点位于第 1 层,其他子节点依次加 1。...search(key):查找一个键,如果节点存在,返回 true;如果不存在,返回 false。 min:返回树中最小值/键。 max:返回树中最大值/键。...遍历树,将要搜索值与遍历到节点比较,如果前者大于后者,递归遍历右侧节点,反之,递归遍历左侧子节点。...(key, node); }; var searchNode = function(key, node){ // 如果node是null,说明树没有要查找值,返回false if (...return searchNode(node.right, key); } else { // 如果查找值等于该节点,说明查找成功,返回节点

    81030

    精读《算法 - 二叉树

    由于二叉树有多种分支,遍历前,我们并不知道哪条路线是最深,所以必须利用递归尝试。 我们可以转换一下思路,用函数式语义方式来理解。...right) return node 如果节点找不到,节点就是答案,否则相反: if (!left) return right return left 这里巧妙利用了函数语义进行结果判断。...二叉树右视图 二叉树右视图是一道中等题,题目如下: 给定一棵二叉树,想象自己站在它右侧,按照从顶部到底部顺序,返回右侧所能看到节点值。...完全二叉树 定义如下:完全二叉树,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层节点都集中该层最左边若干位置。...说明右子树深度减 1 是满二叉树,也可以通过数学公式快速计算节点个数,再通过递归计算另一边即可。 总结 从题目中可以感受到,二叉树解题魅力在于递归,二叉树问题中,我们可以同时追求优雅与答案

    29510

    JS数据结构之二叉查找树(BST)

    介绍 二叉查找树(Binary Search Tree, BST)也叫做有序二叉树。对于树每个节点,都要满足左子树所有项比它小,右子树所有项比它大。...但是,极端情况下,它会退化为一个普通链表,此时再进行操作时间复杂度就会是 O(n) 了。 这个问题需要平衡二叉树来解决,本文只讨论普通二叉查找树。 实现 逐个函数来分析。...如果查找值比当前节点值小,就去左子树查找如果大,就去右子树查找。 既不大于也不小于,那就是相等,返回true。 后续算法与这些步骤都是类似的。...如果node.left不为空,那么insert(node.left, val)返回还是node.left,此时插入已经更深层次完成。...最深层递归函数执行结束,返回上一层函数,是node.left = remove(node.left, val)。 执行结束,再把这个节点本身返回给上一层函数。

    56930

    数据结构:一文看懂二叉搜索树 (JavaScript)

    this.insert = insert } 1.3 节点插入(三种情况) 由于二叉搜索树特殊性质确定了二叉搜索树每个元素只可能出现一次,所以插入过程如果发现这个元素已经存在于二叉搜索树,...3.1 四种情况 先判断传入 node 是否为 null,如果为 null 就表示查找失败,返回 false。 找到了节点返回 true。 要找节点,比当前节点小,左侧节点继续查找。...要找节点,比当前节点大,右侧节点继续查找。...查找最大值,往二叉树右侧查找,直到该节点 right 为 null 没有右侧节点,证明其是最大值。...判断要删除节点小于当前节点,往树左侧查找 判断要删除节点大于当前节点,往树右侧查找 节点已找到,另划分为四种情况: 4.1.当前节点即无左侧节点又无右侧节点,直接删除,返回 null 4.2.

    48520

    javascript进阶必备二叉树知识

    没错,这个阶段我们应该了解就是数据结构,算法,设计模式相关知识,设计模式和算法笔者之前文章已经系统总结过了,感兴趣可以学习了解一下。...二叉树特点是每个结点最多只能有两棵子树,且有左右之分。 二叉树节点最多只能有两个子节点:左侧子节点右侧节点。我们接下来主要来实现一个二叉搜索树(BST)。...它是二叉树一种,但是只允许你左侧节点存储比父节点值,右侧节点存储比父节点大(或者等于)值。如下图: 接下来我们就一起实现一下BST树。...,具体代码如下: function insertNode(node, newNode) { // 如果节点值小于当前节点值,插入左子节点 if(newNode.key < node.key...(node.left, newNode); } }else { // 如果节点值大于当前节点值,插入右子节点 if(node.right === null

    54220

    实现一个二叉搜索树(JavaScript 版)

    二叉树计算机科学应用很广泛,学习它有助于让我们写出高效插入、删除、搜索节点算法。二叉树节点定义:一个节点最多只有两个节点,分别为左侧节点右侧节点。...二叉搜索树是二叉树一种,二叉搜索树每个父节点键值要大于左边子节点小于右边子节点。下图展示一颗二叉搜索树。 ?...行 {2} 说明已经找到了节点返回 true。 行 {3} 表示要找节点,比当前节点小,左侧节点继续查找。 行 {4} 表示要找节点,比当前节点大,右侧节点继续查找。...序遍历 序遍历,先访问左侧节点,直到为最小节点访问到树底端,将当前节点 value 取出来,访问右侧节点,适用于从小到大排序。...这就是二叉搜索树存在问题,它可能是极端,并不总是向左侧永远是一个平衡二叉树如果我顺序化插入树形状就如右侧所示,会退化成一个链表,试想如果我需要查找节点 40,右图所示树形需要遍历完所有节点

    1.4K30

    【化解数据结构】详解树结构,并实现二叉搜索树

    这里主要就讲二叉树,因为其他有点难,还没有学 二叉树节点最多只能有两个子节点,一个是左侧节点,一个是右侧节点,如图就是一棵二叉树 二叉搜索树:左侧节点存储小值,右侧节点存储大值,因此也就是从左到右...在这里就罗列几个常见方法吧 方法 作用 insert 向二叉搜索树插入数据 serach 查找某个值 remove 移除某个值 还有很多比如返回最大值,返回最小值方法,都可以实现,这里就不写那么多了...根据二叉搜索树特性,我们采用递归方式 首先先判断传入节点和根节点大小关系 如果比根节点小,放到左子树,反之 如果当前左(右)子树为空,它直接成为左树第一个节点 如果不为空,我们接着比较它和左...这种情况是复杂 找到该节点右子树最小值 然后用这个最小值,去替代当前这个被删除节点 之后我们需要删除右子树那个节点 最后返回更新后节点引用 在这里我们使用了一个自己封装方法 findMinNode...我们做题时候,不必封装一个完整树,只需要我们知道有这个数据结构,我们需要使用时候,我们提取它灵魂即可,学了这么多数据结构,也能发现,它们都是通过数组或者对象封装而成,因此它们本质还是我们熟悉东西

    28420

    文心一言 VS 讯飞星火 VS chatgpt (148)-- 算法导论12.2 3题

    如果节点有父节点直接返回节点如果节点是根节点返回nil。如果节点没有左子节点递归查找右子树前驱节点如果节点既没有左子节点也没有右子节点返回nil,表示没有前驱节点。...左子树上查找 leftPredecessor := TreePredecessor(node.Left) // 如果找到左子树前驱,返回它;否则,返回节点 if...在这里插入图片描述 在这里插入图片描述 通义千问: 二叉查找树(BST),TREE-PREDECESSOR 过程用于找到给定节点前驱节点。前驱节点是小于给定节点最大节点。...如果 x 为空,返回 nil。如果 x 就是要查找祖先节点返回 x。如果 v 是 x 节点返回 x。否则,递归地查找 x 左子树和右子树,直到找到祖先节点为止。...在这里插入图片描述 在这里插入图片描述 kimi: TREE-PREDECESSOR 是一个用于二叉树查找给定节点前驱节点算法。

    19120

    【学习】K近邻算法基础:KD树操作

    令split域值为i,如果空间Range某个数据点第i维数据小于Node-Data[i],那么,它就属于该节点空间左子空间,否则就属于右子空间。...KD树查找算法: k-d树中进行数据查找也是特征匹配重要环节,其目的是检索k-d树与查询点距离最近数据点。 这里先以一个简单实例来描述邻近查找基本思路。...2、而找到叶子节点并不一定就是邻近邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点圆域内。...图5 k-d树查询算法简要说明: 从root节点开始,DFS搜索直到叶子节点,同时stack顺序存储已经访问节点如果搜索到叶子节点,当前叶子节点被设为最近邻节点。...如果相交,必须到父节点另外一侧,用同 样DFS搜索法,开始检查最近邻节点如果不相交,继续往上回溯,而父节点另 一侧子节点都被淘汰,不再考虑范围.

    1.2K50

    【化解数据结构】详解树结构,并实现二叉搜索树

    这里主要就讲二叉树,因为其他有点难,还没有学 二叉树节点最多只能有两个子节点,一个是左侧节点,一个是右侧节点,如图就是一棵二叉树 二叉搜索树:左侧节点存储小值,右侧节点存储大值,因此也就是从左到右...在这里就罗列几个常见方法吧 方法 作用 insert 向二叉搜索树插入数据 serach 查找某个值 remove 移除某个值 还有很多比如返回最大值,返回最小值方法,都可以实现,这里就不写那么多了...根据二叉搜索树特性,我们采用递归方式 首先先判断传入节点和根节点大小关系 如果比根节点小,放到左子树,反之 如果当前左(右)子树为空,它直接成为左树第一个节点 如果不为空,我们接着比较它和左...这种情况是复杂 找到该节点右子树最小值 然后用这个最小值,去替代当前这个被删除节点 之后我们需要删除右子树那个节点 最后返回更新后节点引用 在这里我们使用了一个自己封装方法 findMinNode...我们做题时候,不必封装一个完整树,只需要我们知道有这个数据结构,我们需要使用时候,我们提取它灵魂即可,学了这么多数据结构,也能发现,它们都是通过数组或者对象封装而成,因此它们本质还是我们熟悉东西

    36430

    TypeScript实现二叉搜索树

    创建辅助类Node 首先,我们需要一个类来描述二叉树每个节点。...如果节点存在返回true, 否则返回false min(): 返回树中最小值 / 键 max(): 返回书中最大值 / 键 remove(key): 从树移除某个键 向树插入一个新节点 验证插入操作是否为特殊情况...如果小于返回-1, 如果大于返回1, 相等返回0 调用compareFn方法判断要插入键是否小于当前节点如果小于, 判断当前节点左子节点是否为null, 如果为null创建Node节点将其指向左子节点...), 如果是说明要找键没找到,返回false 调用compareFn方法比对要查找节点与当前节点key进行大小比较 如果查找节点小于当前节点key,递归调用searchNode方法,传当前节点左子节点和要查找...key 如果查找节点大于当前节点key,递归调用searchNode方法,传当前节点右子节点和要抄着key 否则就是相等,节点已找到,返回true 接下来,我们通过一个例子来描述下搜索特定过程

    49120

    一天一大 lee(二叉树序遍历)难度:中等-Day20200914

    题目: 给定一个二叉树返回序 遍历。...从根节点开始这个查找其左节点(先入后出) 遍历完左节点,逐个取出栈内节点 当前节点不仅仅是单个二叉树节点,也可能是二叉子树,如果其是二叉子树同样遍历其左节点入栈 var inorderTraversal...如果 node 无左孩子,先将 node 值加入答案数组,再访问 node右孩子,即 node = node.right 如果 node 有左孩子,找到 node 左子树上最右节点(即左子树序遍历最后一个节点...,node 序遍历前驱节点),记为predecessor。...右孩子,即 node = node.right 简要讲就是,序遍历是左子树走到尽头是,需要回溯到之前出现某个节点节点上,就使用predecessor记录这个回溯位置,是不存在关系节点在遍历时连续起来

    30820

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

    Tag : 「剑指 Offer」、「二叉树」、「序遍历」 给定一个二叉树其中一个结点,请找出序遍历顺序下一个结点并且返回。...输入描述:输入分为2段,第一段是整体二叉树,第二段是给定二叉树节点值,后台会将这2个参数组装为一个二叉树局部子树传入到函数GetNext里面,用户得到输入只有一个子树根节点。...返回描述返回传入子树根节点下一个节点,后台会打印输出这个节点。...」,可以确定「下一个节点」必然为当前节点「右子树」靠左节点」; 传入节点 pNode 没有「右儿子」,这时候需要根据当前节点是否为其「父节点「左儿子」来进行分情况讨论: 如果传入节点 pNode...「序遍历」遍历顺序为为 「左-根-右」 可知,其父节点已经被遍历过了,我们需要递归找到符合 node.equals(node.next.left) 节点作为答案返回如果没有说明当前节点是整颗二叉树靠右节点

    63820

    力扣 (LeetCode)-对称二叉树,树|刷题打卡

    一个树结构包含一些列存在父子关系节点 位于树顶部节点叫做根节点,它没有父节点每个元素都叫作节点节点分内部节点和外部节点 至少有一个子节点节点称为内部节点 没有子元素节点称为外部节点或叶节点...另一个是右侧节点 二叉搜索树是二叉树一种,但是它只允许你左侧节点存储小值,右侧节点存储大值 二叉搜索树数据结构 创建BinarySearchTree类 function BinarySearchTree...另一个指向右侧节点 insert(key),向树插入一个新键 search(key),查找一个键,如果节点存在,返回true;如果不存在,返回false inOrderTraverse,...== null) { node = node.left; } return node; // findMinNode返回节点 }; 二叉搜索树 自平衡树 BST存在一个问题:树一条分支会有很多层...对称二叉树 一、题目描述 给定一个二叉树,检查它是否是镜像对称。 ?

    41220

    怒肝 JavaScript 数据结构 — 树与二叉树

    其实数据结构树也是一样,顶部只有一个元素,然后一个元素下包含多个子元素,子元素又包含子元素,层层包含下去,最终组成了一个庞大数据体。...好了,这里介绍了树基本概念,接下来介绍二叉树二叉树与二叉搜索树 首先,二叉树是树一种,拥有树基本属性。但它特点是每个节点最多只能有 两个 子节点:一个左侧子节点和一个右侧节点。...二叉搜索树(BST)是二叉树一种,但它要求必须在左侧子节点存储比父节点值,右侧节点存储比父节点值。上图中灰色部分由 13、12、14 三个节点组成树就是一棵二叉搜索树。...在这个基础类下,我们还要自定义几个方法: insert(key):插入一个键 search(key):查找一个键 inOrderTraverse():通过序遍历方式遍历所有节点 preOrderTraverse...填充两侧节点逻辑是一样,先判断节点对应属性(left 或 right)是否存在,如果不存在执行正常添加逻辑,如果存在就获取节点,进入递归循环。

    35420

    总结了一些二叉树操作干货……

    这里后序实际上是指根节点相对左右子节点位置来描述,如前序遍历就是指根节点在左右节点之前,序则是根节点在左右子节点之间,后序则是根节点在最后。 ?...如图中二叉树所示,其不同遍历方式结果分别为: 前序:1-2-4-5-3-6 序:4-2-5-1-3-6 后序:4-5-2-6-3-1 层级遍历:1-2-3-4-5-6 前后序遍历操作简单写法是用递归...迭代写法可以直接将每一层数值遍历,如果当前层节点取值是对称继续判断下一层,否则直接返回false class Solution: def isSymmetric(self, root:...迭代写法,首先遍历整个树构建每个节点前溯节点,进而根据两个节点前溯节点反向对比,直至找到第一个公共节点。...这里给出其比较巧妙递归写法:从宏观着眼,两个节点若在根节点同一侧子树查找公共祖先一定是该子树某个节点;否则若两个节点分居根节点两侧,节点就是唯一公共祖先,自然也就是最早公共祖先。

    29210

    总结了一些算法二叉树操作干货 (附Python代码)

    这里后序实际上是指根节点相对左右子节点位置来描述,如前序遍历就是指根节点在左右节点之前,序则是根节点在左右子节点之间,后序则是根节点在最后。 ?...如图中二叉树所示,其不同遍历方式结果分别为: 前序:1-2-4-5-3-6 序:4-2-5-1-3-6 后序:4-5-2-6-3-1 层级遍历:1-2-3-4-5-6 前后序遍历操作简单写法是用递归...迭代写法可以直接将每一层数值遍历,如果当前层节点取值是对称继续判断下一层,否则直接返回false class Solution: def isSymmetric(self, root:...迭代写法,首先遍历整个树构建每个节点前溯节点,进而根据两个节点前溯节点反向对比,直至找到第一个公共节点。...这里给出其比较巧妙递归写法:从宏观着眼,两个节点若在根节点同一侧子树查找公共祖先一定是该子树某个节点;否则若两个节点分居根节点两侧,节点就是唯一公共祖先,自然也就是最早公共祖先。

    29920
    领券