【发布时间】:2015-04-17 11:12:01
【问题描述】:
我正在阅读破解编码面试,我对以下问题的解决方案有疑问: 你有两棵非常大的二叉树:T1,有数百万个节点,T2,有数百个节点。创建一个算法来确定 T2 是否是 T1 的子树。
它建议的简单解决方案是创建一个表示有序和前序遍历的字符串,并检查 T2 的前序/有序遍历是否是 T1 的前序/有序遍历的子字符串。
我想知道为什么我们需要比较两个遍历?以及为什么要进行两次遍历,例如按顺序和后序遍历。主要是一次遍历不够吗?只说按顺序或前序遍历?
【问题讨论】:
-
首先让我们澄清一下“子树”的含义。标准的图论含义是“从一棵树中删除零个或多个顶点和边形成的子图,它本身就是一棵树”——但还有另一个常用的含义,即“删除一条边;2 个连通分量仍然存在,它们都是子树”。前一个定义包括了一些后者没有的树。
-
有趣的是,您给出的算法不适用于“子树”的一些合理定义:作为数学家,我将 23 称为 43->5。但是第一个的前序不是第二个的子串。
-
当你说“二叉树”时,我们可以假设它们是“二叉搜索树”(即,一个父节点小于它的两个子节点中的任何一个)吗?此外,每个树中节点上的值是否唯一?