用于在树中查找相同值的节点的最大连接区域的大小的算法

时间:2018-01-06 09:56:39

标签: algorithm

这是我在采访中遇到的一个问题,我还不完全确定如何解决。

假设我们有一个数字树,我们想要找到树中节点具有相同值的最大连通区域的大小。例如,在这棵树中

POST /index/type/_delete_by_query
{
    "query" : { 
        "match_all" : {}
    }
}

答案是4,因为你有一个4个连接3s的区域。

2 个答案:

答案 0 :(得分:3)

我建议使用带有两个输入的函数进行深度优先搜索:

  1. 目标值
  2. 起始节点
  3. 并返回两个输出:

    1. 节点子树的大小,其值等于目标值
    2. 节点子树中连接区域的最大大小
    3. 然后,您可以使用虚拟目标值(例如-1)和根节点调用此函数,它将在第二个输出中返回答案。

      在伪代码中:

      dfs(target_value,start_node):
        if start_node.value == target_value:
           total = 1
           best = 0
           for each child of start_node:
             x,m = dfs(target_value,child)
             best = max(m,best)
             total += x
           return total,best
        else
           x,m = dfs(start_node.value,start_node)
           return 0,max(x,m)
      
      _,ans = dfs(-1, root_node)
      print ans
      

答案 1 :(得分:0)

将计数器与每个节点相关联,以表示以该节点为根的最大连接区域,其中所有节点都是相同的值。每个节点将此计数器初始化为1。

在树上运行DFS。

当您从任何节点备份时,如果两个节点具有相同的值,请将子节点的计数器添加到父节点的计数器。

完成后,与节点关联的最大计数器就是您的答案。您可以在运行算法时跟踪此信息。