树的递归题解

今天做了三道解法差不多的三道题目,它们的递归形式都很类似,因为树的题目大多都和遍历,递归有关,就是深度优先搜索。

然后总结了一下树递归的模板:

        1,定义一个dfs()的递归函数,传入一棵树和保存的容器。

        2,对该树为null的情况进行判断。

        3,对左子树进行dfs()的递归,保存左子树的递归结果。

        4,对右子树进行dfs()的递归,保存右子树的递归结果。

        5,已知本树的根节点的值,本节点左子树的递归结果,本节点右子树的递归结果,做一些计算,用map或list保存计算结果。

        6,返回本次的递归结果。

. - 力扣(LeetCode)

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;
    }
}

. - 力扣(LeetCode)

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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值