1. 程式人生 > 其它 >合併二叉樹(leetcode-617)

合併二叉樹(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);
        }
    }
};

程式碼解釋

我們的注意力放在當前指向的節點本身,不關注這個節點的左右節點。