【问题标题】:Algorithm to identify if tree is subtree of other tree识别树是否是其他树的子树的算法
【发布时间】:2015-04-17 11:12:01
【问题描述】:

我正在阅读破解编码面试,我对以下问题的解决方案有疑问: 你有两棵非常大的二叉树:T1,有数百万个节点,T2,有数百个节点。创建一个算法来确定 T2 是否是 T1 的子树。

它建议的简单解决方案是创建一个表示有序和前序遍历的字符串,并检查 T2 的前序/有序遍历是否是 T1 的前序/有序遍历的子字符串。

我想知道为什么我们需要比较两个遍历?以及为什么要进行两次遍历,例如按顺序和后序遍历。主要是一次遍历不够吗?只说按顺序或前序遍历?

【问题讨论】:

  • 首先让我们澄清一下“子树”的含义。标准的图论含义是“从一棵树中删除零个或多个顶点和边形成的子图,它本身就是一棵树”——但还有另一个常用的含义,即“删除一条边;2 个连通分量仍然存在,它们都是子树”。前一个定义包括了一些后者没有的树。
  • 有趣的是,您给出的算法不适用于“子树”的一些合理定义:作为数学家,我将 23 称为 43->5。但是第一个的前序不是第二个的子串。
  • 当你说“二叉树”时,我们可以假设它们是“二叉搜索树”(即,一个父节点小于它的两个子节点中的任何一个)吗?此外,每个树中节点上的值是否唯一?

标签: algorithm tree


【解决方案1】:

一次遍历是不够的。考虑图 1->2->3 和 23。如果您从节点 1 开始并进行遍历,您会遇到顺序为 1、2、3 的节点。如果您只是创建一个显示预购顺序的字符串,则两者会给出相同的结果:1,2,3

另一方面,如果你使用后序,那么两者会给出不同的结果。 3,2,12,3,1

我打赌任何一个排序,你都可以找到两棵不同的树,结果相同。

因此,对于要查看的任何其他对,您需要自己回答的问题是:是否有一棵树会为两次遍历提供相同的顺序?我将把它留作考虑,稍后再回来看看你是否明白。

【讨论】:

    【解决方案2】:

    我认为用哨兵进行前序遍历来表示空节点就足够了。 我们可以使用这种方法来序列化/反序列化二叉树。这意味着,它是二叉树与其前序+哨兵表示之间的一对一映射。

    在我们得到小树和大树的字符串之后。然后我们使用 kmp 算法进行字符串匹配。

    我知道人们说我们必须同时使用 preorder 和 inorder(或 postorder 和 inorder)。但他们中的大多数人只是听从别人的话,而不是独立思考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多