Find Duplicate Subtrees 解题心得

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

总结

开始对于这道题的看法是希望通过某种手段利用已经记录的子树的信息,来记录上层的子树。但是后来实在想不到用什么方法,可能是因为树类的题目做的不多,没有想到用特殊处理的前缀表达式唯一表示树结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值