从二叉树中的给定节点查找最近的叶节点。
如果树是:
1
2 3
4 5
6 7
9 8
比2中最短的叶子节点是3.有人可以帮助我设计一个算法。谢谢。
我能够找到节点是否是根节点(通过简单的DFS),但是在这种情况下节点不是最短的远叶节点的祖先的情况下,无法设置算法。
树表示:
Class TreeNode{
int val;
TreeNode left, right;
}
您获得了一个节点,即t1
和根,即t
。
答案 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。给定节点的相邻节点都是其子节点及其前任节点(如果有的话)。您必须选择树的适当表示,以便您可以找到给定节点的前任及其子节点。
另请注意,对于此问题,您必须将图表视为无向图。