今天做了三道解法差不多的三道题目,它们的递归形式都很类似,因为树的题目大多都和遍历,递归有关,就是深度优先搜索。
然后总结了一下树递归的模板:
1,定义一个dfs()的递归函数,传入一棵树和保存的容器。
2,对该树为null的情况进行判断。
3,对左子树进行dfs()的递归,保存左子树的递归结果。
4,对右子树进行dfs()的递归,保存右子树的递归结果。
5,已知本树的根节点的值,本节点左子树的递归结果,本节点右子树的递归结果,做一些计算,用map或list保存计算结果。
6,返回本次的递归结果。
class Solution {
Set<Integer> list=new HashSet<>();
public int maxProduct(TreeNode root) {
int sum=0;
if(root==null){
return 0;
}
sum=getSum(root);
dfs(root);
long res=0;
for(long i:list){
res=Math.max(res,i*(sum-i));
}
return (int)(res%1000000007);
}
public int dfs(TreeNode root){
if(root==null){
return 0;
}
int left=dfs(root.left);
int right=dfs(root.right);
int val=root.val+left+right;
list.add(val);
return val;
}
public int getSum(TreeNode root){
if(root==null){
return 0;
}
int left=getSum(root.left);
int right=getSum(root.right);
return root.val+left+right;
}
}
class Solution {
int max=0;
List<Integer> res=new ArrayList<>();
Map<Integer,Integer> map=new HashMap<>();
public int[] findFrequentTreeSum(TreeNode root) {
helper(root);
int[] tmp=new int[res.size()];
int j=0;
for(Integer i:res){
tmp[j++]=i;
}
return tmp;
}
public int helper(TreeNode root){
if(root==null){
return 0;
}
int left=helper(root.left);
int right=helper(root.right);;
int val=root.val+left+right;
map.put(val,map.getOrDefault(val,0)+1);
if(map.get(val)>max){
max=map.get(val);
res.clear();
res.add(val);
}else if(map.get(val)==max){
res.add(val);
}
return val;
}
}
https://leetcode-cn.com/problems/find-duplicate-subtrees/ //这篇是其他人写的
class Solution {
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
Map<String,Integer> map=new HashMap<>();
List<TreeNode> res=new ArrayList<>();
dfs(root,map,res);
return res;
}
public StringBuilder dfs(TreeNode root,Map<String,Integer> map,List<TreeNode> res){
if(root==null){
return new StringBuilder("$");
}
StringBuilder left=dfs(root.left,map,res);
StringBuilder right=dfs(root.right,map,res);
StringBuilder sb=new StringBuilder(root.val+" ").append(left).append(right);
map.put(sb.toString(),map.getOrDefault(sb.toString(),0)+1);
if(map.get(sb.toString())==2){
res.add(root);
}
return sb;
}
}