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

时间:2015-04-14 05:51:23

标签: java recursion tree binary-tree

我正在进行一项任务,我已经找到了解决问题的方法(看起来非常简单,但就像魔法一样)

我仍然无法理解递归的确切作用,我实际上想要学习。

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

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

功能如下:

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 个答案:

答案 0 :(得分:2)

如果您位于底部,则底部的最大路径为零。

如果你不在底部,你可以左转或右转。想象一下,你向左走,看看它到底有多远。到左边底部的距离比那里多一个(计算+1左边的步骤)。然后想象你走对了;距离底部那里的距离再次比从新位置向右一步测量它的距离还多一个。如果向左走,则表示离开后还有三个步骤(四个计算左边的初始步骤),向右走,表示底部有六个步骤(右边有七个步骤),然后到底部的最长路径是七个(这两者中的较大者。)

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

说这是我们的树。从A开始,向左走,还有3个步骤要走;踩到右边还有1个。因此,A的总最大路径长度为4(1 + max(3, 1))。

我们怎么知道B有3个步骤?呃,向左走,从底部开始有一步。向右走,有两个步骤。 1 + max(1, 2)是3。

等等,我们怎么知道从D出发还有一步?这是如下:踩到左边,我们在底部(没有任何东西),所以距离是0.并且踩到右边,同样的事情:0再次。 1 + max(0, 0)为1。

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

答案 1 :(得分:1)

如果它可以帮到你:

首先,将findPath重命名为更合适的内容,例如longestPathLength

然后你可以看到1 +作为因子分解,但它可以是非因子化的:

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

这个想法是:在从根到​​末尾的所有路径中,一些路径通过左子树,其他路径通过右子树。

通过左子树的最长路径的长度是:左子树中 中最长路径的长度,加上一个用于根的树的长度外面的节点。在右侧同意。

但最终递归是你必须要克服的。它可以帮助首先看一些简单的数学例子,或者更简单的数据结构(比如列表的长度)。