- 博主简介:努力学习的22级计算机科学与技术本科生一枚
- 博主主页: @是瑶瑶子啦
- 每日一言: 你不能要求一片海洋,没有风暴,那不是海洋,是泥塘——毕淑敏
我们清楚,在二叉树的遍历中,通常有三个位置:
今天我们来具体总结一下其中的两个位置:
下面详细讲一个题目,来体会一下
思路:
♀️代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<String, Integer> map = new HashMap<>(); //存储二叉树的序列化字符串,判断是否重复
List<TreeNode> ans = new ArrayList<>(); //存储答案,即:有重复子树的根节点
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
dfs(root); //遍历二叉树
return ans;
}
//这个遍历函数的作用:序列化一颗二叉树,返回序列化字符串(利用好返回值)
String dfs(TreeNode root){
if(root == null) return"#";
StringBuilder sb = new StringBuilder();
//前序位置
sb.append(root.val).append(",");
//中序
sb.append(dfs(root.left)).append(dfs(root.right));//获取左右子树信息
//后序位置
String key = sb.toString();//存储整个二叉树信息
map.put(key, map.getOrDefault(key, 0) + 1);
if(map.get(key) == 2) ans.add(root); //一旦超过2个。就add
return key;
}
}
若有疑问的地方,欢迎随时在评论区or私信找瑶瑶子交流讨论
Java岛冒险记【从小白到大佬之路】
LeetCode每日一题–进击大厂
Go语言核心编程
算法