同一子树的二叉树压缩

binary tree compaction of same subtree

给定一棵树,找到公共子树并替换公共子树并压缩树。 例如

      1
     /  \
     2   3
   / |   /\
  4  5  4  5

应转换为

      1
     /  \
     2   3
   / |   /\
  4  5   | |

  ^  ^   | |

  |__|___| |

     |_____|

这是在我的采访中被问到的。我分享的方法不是最佳的 O(n^2),如果有人可以帮助解决或将我重定向到类似的问题,我将不胜感激。我找不到任何。然后!

编辑-更复杂,例如:

       1
     /  \
     2   3
   / |   /\
  4  5  2  7
       /\
      4  5

应替换以 2 为根的整个子树。

      1
     /  \
     2 <--3
   / |     \
  4  5      7
    

您可以使用来自 (value, left_pointer, right_pointer) -> node 的散列映射在单个 DFS 遍历中执行此操作,以折叠重复出现的子树。

当您将每个节点留在 DFS 中时,您只需在地图中查找即可。如果匹配的节点已经存在,则将其替换为 pre-existing 节点。否则,将其添加到地图中。

这需要O(n)的时间,因为你是在比较实际的指针指向左+右子树,而不是遍历树来比较它们。指针比较结果相同,因为左右子树已经规范化.

首先,我们需要存储出现在散列中的节点值table。如果树已经存在,我们可以迭代树,如果节点值已经在节点集中,则删除该节点的分支。否则,将值存储在哈希映射中,每次创建新节点时,检查该值是否出现在映射中。