【LeetCode】872.叶子相似的树


1 问题

请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列
叶值序列
举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。

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

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

示例 1

实例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

实例2

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

提示

  • 给定的两棵树结点数[1, 200] 范围内
  • 给定的两棵树上的[0, 200] 范围内

2 解题思路

2.1 DFS

分别遍历两棵树的节点,将叶子节点入队,最终判定队列结果是否相等。

  • 时间复杂度:nm 分别代表两棵树的节点数量。复杂度为 O(n+m)
  • 空间复杂度:nm 分别代表两棵树的节点数量,当两棵树都只有一层的情况,所有的节点值都会被存储在 list 中。复杂度为 O(n+m)

2.2 迭代

通过手工入栈出栈,模拟递归流程。

3 代码

3.1 DFS

/**
 * 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 {
    //dfs
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List<Integer> seq1 = new ArrayList<Integer>();
        List<Integer> seq2 = new ArrayList<Integer>();
        dfs(root1, seq1);
        dfs(root2, seq2);
        return seq1.equals(seq2);
    }

    private void dfs(TreeNode root, List<Integer> seq){
        if(null == root){
            return;
        }
        if(null==root.left && null==root.right){
            seq.add(root.val);
        }
        dfs(root.left, seq);
        dfs(root.right, seq);
    }
}

3.2 迭代

class Solution {
    public boolean leafSimilar(TreeNode t1, TreeNode t2) {
        List<Integer> l1 = new ArrayList<>(), l2 = new ArrayList<>();
        process(t1, l1);
        process(t2, l2);
        if (l1.size() == l2.size()) {
            for (int i = 0; i < l1.size(); i++) {
                if (!l1.get(i).equals(l2.get(i))) return false;
            }
            return true;
        }
        return false;
    }
    void process(TreeNode root, List<Integer> list) {
        Deque<TreeNode> d = new ArrayDeque<>();
        while (root != null || !d.isEmpty()) {
            while (root != null) {
                d.addLast(root);
                root = root.left;
            }
            root = d.pollLast();
            if (root.left == null && root.right == null) list.add(root.val);
            root = root.right;
        }
    }
}

//作者:宫水三叶
//链接:https://leetcode.cn/problems/leaf-similar-trees/solutions/767347/gong-shui-san-xie-yi-ti-shuang-jie-di-gu-udfc/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

文章作者: Kezade
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kezade !
评论
  目录