当前位置: 首页 > 知识库问答 >
问题:

递归在这个二叉树最长路径函数中是如何工作的?

许承悦
2023-03-14

我现在正在做一项作业,我已经在网上找到了解决问题的方法(看起来简单得离谱,但就像魔术一样)

我仍然很难理解递归到底是如何工作的,我真的很想学。

有人能帮我理解这个逻辑吗?

问题是找到从根节点到叶节点的最长路径。(基本上找到树的高度?)。

函数如下:

public static int findPath(TreeNode<Integer> node)
    {
        if (node == null)
            return 0;
        else
        {
            return 1 + Math.max(findPath(node.left), findPath(node.right) );
        }
    }

这是我的treeNode类定义:

public class TreeNode<T> {
    T v;
    TreeNode<T> left;
    TreeNode<T> right;
    TreeNode(T value) //initialize treeNode with treeNode(value) 
    {
        v = value;
        left = null;
        right = null;
    }
}

共有2个答案

鲍俊杰
2023-03-14

如果它能帮助你:

首先,将<code>findPath</code>重命名为更合适的名称,如<code>longestPathLength</code>。

然后您可以将1视为因式分解,但它仍然可以是非因式分解:

Math.max(1 + findPath(node.left), 1 + findPath(node.right) );

这个想法是:在从根到尽头的所有路径中,一些穿过左边的子树,另一些穿过右边的子树。

通过左子树的最长路径长度为:左子树中最长路径的长度,加上外部根节点的长度。我在右边。

但是最终递归是你必须要解决的问题。首先在一些简单的数学例子或者更简单的数据结构(比如一个列表的长度)上看到它会有所帮助。

范承望
2023-03-14

如果你在底部,到底部的最大路径是零。

如果你不在底部,你可以向左或向右走。想象你向左走,看看它到底有多远。到左侧底部的距离则比该距离大一(计算1的左侧步数)。然后想象你走对了;到底部的距离又比你从新位置向右一步测量的距离多一倍。如果向左走表示在向左走之后还有三步(四步算上最初的向左步),向右走表示还有六步到达底部(七步算上第一步的向右步),那么到达底部的最长路径是七步(二者中的较大者)。

       A
      / \
     /   \
    B     C
   / \   ' `
  D   E
 ' ` ' \
        F
       ' `

说这是我们的树。从A向左走,还有3步要走;向右走还有1步。因此,来自A的总最大路径长度为4(<code>1 max(3,1)</code>)。

我们怎么知道B有3步?嗯,向左走,从底部开始有1步。向右走,还有2步。1 max(1,2)是3。

等等,我们怎么知道从D到还有一步?这就是方法:向左走,我们在底部(那里什么都没有),所以距离是 0。向右走,同样的事情:再次0。1 最大值(0, 0) 为 1。

所有其他节点的计算类似。所有显示为中止弧的节点的值都为0(它们是递归的“终止条件”)。所有其他节点都将检查两个子树,看看哪一个子树更深。

 类似资料:
  • 很长一段时间以来,我一直在解决这项任务。我需要编写一个递归函数来检查每个节点是否小于其任何子节点。如果二叉树是最小堆,则返回 true,否则返回 false。 到目前为止我所拥有的:

  • 该方法的规范声称,该方法,从根开始,将移除最左侧的节点,并修复树结构。它还指出,如果最左侧节点没有左子节点,则将右子节点(可能为)作为左子节点附加到最左侧节点的父节点(我在代码中看不到这种情况发生的地方)。代码如下: 我只是不明白它是如何返回整个树和返回最左边的节点。主要是第一部分让我感到困惑,它说如果返回右边的子项。如果我深入到树中(由于递归调用),返回右不就会切断树的很多部分吗?

  • 这就是问题所在: 给定一棵二叉树,求最大路径和。 对于这个问题,路径被定义为沿着父子连接从某个起始节点到树中任何节点的任何节点序列。路径必须至少包含一个节点,并且不需要通过根。 例如:给定下面的二叉树, 返回6。 此问题的递归解决方案如下所示: 我们为左子调用< code>helper,并检查左子是否大于零。 然后,我们为右孩子调用< code>helper,并检查右孩子是否大于零。 然后我们检查

  • 我试图用python写一个递归函数,给定一个二叉树,一个节点返回一个包含节点方向的字符串。我已经接近了,但是我的最终返回语句给了我路径和节点(我不需要节点)即LRLR4。 这是我到目前为止的代码: 有没有一种方法可以在不使用字符串输出末尾的节点的情况下实现这一点? 编辑:添加了所有实际代码,并且有问题的树包含每个节点的单个字母字符串。

  • 我试图用kotlin中的递归来回答leetcode上二叉树中最长的曲折路径。输入如下所示 并表示二叉树。我遇到的问题与递归有关,我当前的代码在访问树中的所有节点后返回 1。但我打算让代码在每个树节点命中后添加 1 并将其添加到该锯齿形总数中。 左和右仅表示每个路径侧的相应之字形。我想知道的是,如何在每次递归调用后以println语句的方式添加这些值

  • 如何在二叉树中找到最小路径和,并打印路径?路径可以从ROOT节点到任何LEAF节点。我已经编写了C代码来查找最小和,但是在打印路径时遇到了问题。 参数列表中的未使用,有人能帮我打印路径和最小的路径吗?