Featured image of post Leaf Similar Trees

Leaf Similar Trees

872. 叶子相似的树

分析

  1. 深度优先搜索 (DFS):
    • 使用递归遍历二叉树
    • 如果当前节点是叶子节点(没有左子节点和右子节点),将其值加入到结果序列中
    • 如果不是叶子节点,则递归遍历其左子树和右子树
  2. 提取叶值序列:
    • root1root2 分别进行深度优先搜索,提取两个叶值序列
  3. 比较序列:
    • 判断两个序列是否相等,如果相等则返回 true,否则返回 false

时间复杂度

  • 深度优先搜索:
    • 对每棵树的所有节点遍历一次,时间复杂度为 O(n) ,其中 n 是节点数量
  • 比较序列:
    • 比较两个序列,时间复杂度为 O(min(n, m)) ,其中 nm 分别为两棵树叶子节点的数量

总体时间复杂度为 O(n)

空间复杂度

  • 递归调用栈:
    • 在最坏情况下(树的深度为树的高度),递归调用栈需要 O(h) 的空间,其中 h 是树的高度
  • 存储叶值序列:
    • 每棵树的叶子节点最多为树节点总数的一半,存储序列的空间复杂度为 O(n)

总体空间复杂度为 O(n)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution
{
public:
    // 深度优先搜索,提取叶子节点的值
    void dfs(TreeNode* root, std::vector<int>& res)
    {
        // 如果当前节点为空,直接返回
        if (!root)
            return;

        // 如果当前节点是叶子节点,记录其值
        if (!root->left && !root->right)
            res.push_back(root->val);

        // 递归遍历左子树和右子树
        dfs(root->left, res);
        dfs(root->right, res);
    }

    bool leafSimilar(TreeNode* root1, TreeNode* root2)
    {
        // 分别存储两棵树的叶值序列
        std::vector<int> a, b;

        // 获取第一棵树的叶值序列
        dfs(root1, a);

        // 获取第二棵树的叶值序列
        dfs(root2, b);

        // 比较两棵树的叶值序列
        return a == b;
    }
};
Built with Hugo
Theme Stack designed by Jimmy