Find Duplicate Subtrees 解题心得
题目:https://leetcode.com/problems/find-duplicate-subtrees/description/
题目复述
给定一二叉树,如下:
1
/ \
2 3
/ / \
4 2 4
/
4
求其重复超过两次(包括两次)的子树的根序列,例子中的重复子树为:
4 2
/
4
输出这两个子树的根节点
题目输入格式:一个树的根节点
输出:重复出现树的根序列
解题思路
暴力解法(放弃:时间复杂度过高):DFS过程中记录每个子树,同时每次在一个根节点比较已经遍历过的子树,寻找是否有相同的子树
思考用一个唯一的标识符Token
确定已经遍历得到的子树,且这个标识符是取决于树的结构,而且相同结构的子树一定有一样的这个标识符Token
,这里我们考虑使用前缀表达式(这里利用了相同结构的子树具有相同的前缀表达式),为了规避特殊情况,这里我们在遍历到空的叶子节点时用#表示,则防止不同结构的树有相同的前缀表达式的情况。
如下面两个子树
2 2
/ \
4 4
前缀表达式:24、24
加入空叶节点的表达式:24###,2#4##
因此可以通过这种方式在DFS一个子树后在根节点获得唯一确定其树结构的Token
为了记录这些Token,并且方便查找,我们可以使用map类对Token记录,并且查看是否有已经存在的Token
最后献上源码:https://github.com/zhanzongyuan/leetcode/blob/master/652_Find%20Duplicate%20Subtrees.cpp
总结
开始对于这道题的看法是希望通过某种手段利用已经记录的子树的信息,来记录上层的子树。但是后来实在想不到用什么方法,可能是因为树类的题目做的不多,没有想到用特殊处理的前缀表达式唯一表示树结构。