链接:LeetCode652
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
相关标签:深度优先搜索
深度优先搜索加哈希表。由于在寻找重复子树过程中,我们需要记住每一步的结果,并且最终记录是否重复,这里可以将子树存储在哈希表中,存储结构使用二叉树进行序列化即可。最终,我们只需要记录在搜索过程中重复数为2的键即可,这样防止出现2个以上重复子树时,返回了多个相同的根节点。
代码如下:
python:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None import collections class Solution: def findDuplicateSubtrees(self, root: TreeNode) -> List[TreeNode]: res = [] if not root:return res hashmap = collections.defaultdict(int) self.dfs(root,hashmap,'',res) return res def dfs(self,root,hashmap,tree,res): if not root: return tree+'#' left = self.dfs(root.left,hashmap,tree,res) right = self.dfs(root.right,hashmap,tree,res) tree += str(root.val)+left+right hashmap[tree] += 1 # 只存储等于2的,防止重复 if hashmap[tree]==2: res.append(root) return tree
C++:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) { vector<TreeNode*> res; if(!root){ return res; } unordered_map<string,int> hashmap; dfs(root,hashmap,"",res); return res; } string dfs(TreeNode* root,unordered_map<string,int> &hashmap,string tree,vector<TreeNode*> &res){ if(!root){ return tree+'#'; } tree += to_string(root->val)+dfs(root->left,hashmap,tree,res)+dfs(root->right,hashmap,tree,res); if(hashmap.find(tree)==hashmap.end()){ hashmap[tree] = 0; } hashmap[tree] ++; if(hashmap[tree] == 2){ res.push_back(root); } return tree; } };
来源:https://www.cnblogs.com/hellojamest/p/12239126.html