合并二叉树(leetcode-617)

题目

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例网站上看吧。

注意: 合并必须从两个树的根节点开始

思路

递归求解。只要两棵树的根节点不为空,那么就可以分解为左子树和右子树两个独立的问题。如果有空的根节点,那么直接返回另一个即可。如果两个都是空就返回空。

代码

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:
    TreeNode *mergeTrees(TreeNode *root1, TreeNode *root2)
    {
        if (root1 == nullptr and root2 == nullptr) return nullptr;
        else if (root1 == nullptr) return root2;
        else if (root2 == nullptr) return root1;
        else {
            TreeNode* l = mergeTrees(root1->left, root2->left);
            TreeNode* r = mergeTrees(root1->right, root2->right);
            return new TreeNode(root1->val += root2->val, l, r);
        }
    }
};

代码解释

我们的注意力放在当前指向的节点本身,不关注这个节点的左右节点。

合并二叉树(leetcode-617)

上一篇:为什么不建议用 equals 判断对象相等?


下一篇:内存段描述符查看