我正在阅读破解编码面试,我对以下问题的解决方案有疑问: 你有两个非常大的二叉树:T1,有数百万个节点,T2,有数百个节点。创建一个算法来确定T2是否是T1的子树。
它建议的简单解决方案是创建一个表示有序和预订遍历的字符串,并检查T2的预订/有序遍历是否是T1的预订/在 - 的子串订单遍历。
我想知道为什么我们需要比较两次遍历?为什么不是两个遍历,为什么不是例如有序和后序。并且主要只赢得一次遍历就够了吗?只说顺序或预先遍历?
答案 0 :(得分:3)
一次遍历还不够。考虑图1-> 2-> 3和2 -1-> 3。如果从节点1开始并进行遍历,则会遇到顺序为1,2,3的节点。如果只是创建一个显示预订的字符串,则两者会给出相同的结果:1,2,3
另一方面,如果您使用后期订单,则两者会给出不同的结果。 3,2,1
和2,3,1
我打赌任何一个订单,你可以找到两个不同的树,结果相同。
因此,您需要为自己想要查看的任何其他对回答的问题是:是否会有一个树可以为两个遍历提供相同的顺序?我会把它留作思考的东西,稍后回来看看你是否已经得到它。
答案 1 :(得分:0)
我认为使用sentinel进行preorder遍历来表示null节点就足够了。 我们可以使用这种方法来序列化/反序列化二叉树。这意味着,它是二叉树与其预订+前哨表示之间的一对一映射。
我们得到小树和大树的字符串。然后我们使用kmp算法进行字符串匹配。
我知道人们说我们必须同时使用预购和顺序(或后序和顺序)。但是大多数人只是按照别人的意思去做,而不是独立思考。