服了,刷题也能上瘾?四

162 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

刷题上瘾计划

导读

曾经实施过的计划(在我博客都能搜到):

在这里插入图片描述

自从开始记录自己的刷题笔记开始我从每日肥学系列,到动态规划二十一天,再到大厂特训二十八天,还有不攻下dfs不比赛系列。有兴趣大家可以去看看。从最后的结果来看我收到了一些志同道合的朋友一起刷题。如果你也想要加入我们可以直接私信我加入我们也可以下面留言打卡,现在我们的队伍还不是很大但是也有几位成功的同学了,有的进入了不错的公司(当然不能说全靠刷题得来的)有的拿到了比赛证书。接下来我会继续坚持下去,这个“瘾”我们要培养起来。所以我们再来一个为期二十八天刷题上瘾训练计划。等这二十八天过完我们在来一起总结一下。

PS:算法不太分语言大家都可以来的。

题目

请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。

举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。

如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

示例 1: 在这里插入图片描述

输入:root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]
输出:true

示例 2:

在这里插入图片描述

输入:root1 = [1,2,3], root2 = [1,3,2]
输出:false

测试地址:地址

思路:我们可以使用深度优先搜索的方法得到一棵树的「叶值序列」。

具体地,在深度优先搜索的过程中,我们总是先搜索当前节点的左子节点,再搜索当前节点的右子节点。如果我们搜索到一个叶节点,就将它的值放入序列中。

在得到了两棵树分别的「叶值序列」后,我们比较它们是否相等即可。

解一:

/**
 * 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 {
    public List<Integer> dfs(TreeNode root,List<Integer> list){
        if(root==null)return list;
        if(root.left==null&&root.right==null){
            list.add(root.val);
            return list;
        } 
        dfs(root.left,list);
        dfs(root.right,list);
        return list;
    }
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> list1=new ArrayList<Integer>();
        List<Integer> list2=new ArrayList<Integer>();
        list1=dfs(root1,list1);
        list2=dfs(root2,list2);
        if(list1.size()!=list2.size())return false;
        for(int i=0;i<list1.size();i++){
            if(list1.get(i)!=list2.get(i))return false;
        }
        return true;
    }
}

解二:有的时候你辛苦写出来的解发现可以能用更简单的方法来弄

class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> seq1 = new ArrayList<Integer>();
        if (root1 != null) {
            dfs(root1, seq1);
        }

        List<Integer> seq2 = new ArrayList<Integer>();
        if (root2 != null) {
            dfs(root2, seq2);
        }

        return seq1.equals(seq2);
    }

    public void dfs(TreeNode node, List<Integer> seq) {
        if (node.left == null && node.right == null) {
            seq.add(node.val);
        } else {
            if (node.left != null) {
                dfs(node.left, seq);
            }
            if (node.right != null) {
                dfs(node.right, seq);
            }
        }
    }
}



重要的事情

如果你在学习python或者Java哪怕是C遇到问题都可以来给我留言,因为在学习初期新手总会走很多弯路,这个时候如果没有有个人来帮一把的话很容易就放弃了。身边很多这样的例子许多人学着学着就转了专业换了方向,不仅是自身问题还是没有正确的学习。所以作为一个过来人我希望有问题给我留言,说不上是帮助就是顺手敲几行字的事情。