【问题标题】:nearest leaf node from given node in binary tree二叉树中离给定节点最近的叶节点
【发布时间】:2014-01-29 01:33:04
【问题描述】:

在二叉树中找到离给定节点最近的叶节点。

如果树是:

                      1

                2         3

           4       5

       6        7

   9        8

比 2 中最短的叶节点是 3。有人可以帮助我为此设计一个算法。谢谢。

我能够找到该节点是否是根节点(通过简单的 DFS),但无法为这种节点不是最短远叶节点的祖先的情况设置算法。

树表示:

Class TreeNode{
    int val;
    TreeNode left, right;
}

您将获得一个节点,即t1 和根,即t

【问题讨论】:

  • 你有没有尝试过?
  • 请阅读我提到的我尝试过的问题以及我面临的问题。谢谢。
  • 贴出你试过的代码
  • @Alessio 不,我试过 DFS。
  • 嗯,我认为一个简单的解决方案是使用带有队列的 BFS...如果你在 google 上搜索会有很多结果 ;) 就像这个 orajavasolutions.wordpress.com/2013/09/10/…

标签: java algorithm data-structures tree


【解决方案1】:

1) 找到离树根最近的叶子(DFS)

2) 找到给定节点的深度,如果你还不知道的话 (DFS)

3) 在其后代(DFS)中找到最接近给定节点的叶子

解是 1+2 和 3 中最短的。大概可以组合成一个 DFS。

正如@Eyal 所指出的,这是错误的。

这里是修复:

1) 对于树中的每个节点,在其后代 (DFS) 中找到最近的叶子。

2) 对于从树根到给定节点的路径上的每个节点,将节点到它最近的后代的距离和到给定节点的距离相加。

通过最小的和给出解决方案。

您可以按如下方式实现:

  • 从 DFS 算法开始,为树中的所有节点找到最近的后代叶子。

  • 修改递归函数,使其知道 a) 当前节点的深度,记为 Dc,b) 给定节点的深度,记为 Dg,以及 c) 自给定节点出现以来达到的最小深度看到了,让 Ds,最初设置为 -1,d) 到目前为止最近的节点(不一定是后代)。

  • 离开函数前,如果当前节点是给定节点,设置Dg= Ds= Dc;否则,如果 Dc

【讨论】:

  • 不准确。考虑树 {1, 1.1, 1.2, 1.1.1, 1.1.2},并假设 1.1.1 在它下面有一棵很深的完整树。在这种情况下,离 1.1.1 最近的叶子是 1.1.2,而不是 1.1.1.* 或 1.2。
  • 非常正确,您需要尝试从树根到给定节点的路径上所有节点的子树。感谢您指出这一点。
  • 谢谢。希望我的回答对你有用。
【解决方案2】:

为了在未加权的图中找到最近的节点,您需要执行 BFS。给定节点的相邻节点是其所有子节点及其前任(如果有)。您将必须选择树的适当表示,以便您可以找到给定节点的前任及其子节点。

另请注意,对于这个问题,您必须将图视为无向图。

【讨论】:

  • 你能解释一下吗?如果我们可以有一些伪代码或代码,那就太好了。谢谢。
  • @user2221126 互联网上到处都有 BFS 的伪代码——它是最流行的算法之一。还有大量关于图形表示的材料。在这种情况下,您最好使用邻接列表。我可以为这个问题写一个代码,但是你自己想出解决方案会更好。我相信我已经为如何做到这一点提供了足够的指导。
  • @IvayloStrandjev 你不能改变树,你只需要遍历树。那么你怎么能做到这一点。这是面试官提到的。谢谢。
  • @JasonBlacket 我从来没有说过你会改变树。那么你给出了树的什么表示?
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多