LeetCode 872 叶子相似的树[DFS 二叉树] HERODING的LeetCode之路
发布日期:2021-05-13 20:58:42 浏览次数:10 分类:精选文章

本文共 1569 字,大约阅读时间需要 5 分钟。

为了判断两棵树是否为“叶子相似的树”,我们需要确保两棵树的叶子节点在同样的顺序下具有相同的值。以下是解决问题的详细步骤:

解题思路

  • 理解问题:叶子相似树要求两棵树的叶子节点顺序一致且对应相等。例如,树一的叶子依次为A、B、C,树二的叶子同样为A、B、C。

  • 选择算法:使用深度优先搜索(DFS)来遍历每棵树的叶子节点。对于每个节点,判断其是否为叶子节点(左右子节点均为空),如果是,则记录其值。收集完成后,比较两棵树的叶子值列表。

  • 递归函数设计:设计一个递归函数遍历树,收集叶子节点的值。该函数首先检查当前节点是否为叶子节点,若是则记录值,否则分别递归处理左右子树。

  • 优化思考:避免不必要的递归,确保叶子节点的顺序一致性。通过先处理左子树再处理右子树的顺序,确保叶子值的收集顺序与树的结构有关。

  • 优化后的代码

    // 定义TreeNode结构体struct TreeNode {    int val;    TreeNode* left;    TreeNode* right;    TreeNode() : val(0), left(nullptr), right(nullptr) {}    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}    TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}};class Solution {public:    void dfs(TreeNode* root, vector
    & res) { if (!root->left && !root->right) { res.push_back(root->val); return; } else { // 先处理左子树 if (root->left) { dfs(root->left, res); } // 再处理右子树 if (root->right) { dfs(root->right, res); } } } bool leafSimilar(TreeNode* root1, TreeNode* root2) { vector
    res1, res2; // 处理根1 if (root1) { dfs(root1, res1); } // 处理根2 if (root2) { dfs(root2, res2); } // 比较结果 return res1 == res2; }};

    代码解释

  • TreeNode结构体:定义了二叉树的节点,包含值、左指针和右指针。

  • dfs函数:使用递归遍历树,收集叶子节点的值。当节点左右都为空时,表示为叶子,直接将值添加到结果列表中。

  • 处理左右子树:分别处理左子树和右子树,确保按照预定顺序(先左后右)收集叶子节点的值。

  • leafSimilar函数:比较两棵树的叶子值列表,返回两个列表是否相等,判断两棵树是否为叶子相似树。

  • 这种方法确保了两种树的叶子节点顺序和值的完全一致性,解决了问题。

    上一篇:LeetCode 1734 解码异或后的排列[数学] HERODING的LeetCode之路
    下一篇:不管用户是否已经关注,授权获取用户的基本信息

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年05月02日 02时05分13秒