二叉树中给定节点的最近叶节点

时间:2014-01-28 08:44:24

标签: java algorithm data-structures tree

  

从二叉树中的给定节点查找最近的叶节点。

如果树是:

                      1

                2         3

           4       5

       6        7

   9        8

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

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

树表示:

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

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

2 个答案:

答案 0 :(得分: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 < Ds,更新Ds = Dc并保持最近的节点和当前节点最近的后代之间的最近节点,增加距离惩罚Dc - Dg。

答案 1 :(得分:0)

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

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