解题思路
可以不用重新建一个新的树,我们直接在原树上建立即可
一共有一下三种情况
- 主有,辅无
- 主无,辅有
- 主有,辅有
根据这三种情况可以做出以下三种操作(operations)
- 直接回溯
- 主树连接辅树的下一个节点
- 合并两个节点的值
代码
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
class Solution: def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]: def dfs(root1, root2): if root1 and root2: root1.val += root2.val if root1.left and root2.left: dfs(root1.left, root2.left) elif root1.left is None and root2.left: root1.left = root2.left if root1.right and root2.right: dfs(root1.right, root2.right) elif root1.right is None and root2.right: root1.right = root2.right if root1 is None or root2 is None: return root2 if root2 else root1 dfs(root1, root2) return root1
|
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
|
class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if (root1 == NULL || root2 == NULL) { return root1 == NULL ? root2 : root1; } dfs(root1, root2); return root1; } void dfs(TreeNode* root1, TreeNode* root2) { if (root1 && root2) root1->val += root2->val; if (root1->left && root2->left) dfs(root1->left, root2->left); else if (root1->left == NULL && root2->left) root1->left = root2->left; if (root1->right && root2->right) dfs(root1->right, root2->right); else if (root1->right == NULL && root2->right) root1->right = root2->right; } };
|
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode { if root1 == nil{ return root2 } if root2 == nil { return root1 } dfs(root1, root2) return root1 }
func dfs(root1 *TreeNode, root2 *TreeNode) { if root1 != nil && root2 != nil { root1.Val += root2.Val } if root1.Left != nil && root2.Left != nil { dfs(root1.Left, root2.Left) } if root1.Left == nil && root2.Left != nil { root1.Left = root2.Left } if root1.Right != nil && root2.Right != nil { dfs(root1.Right, root2.Right) } if root1.Right == nil && root2.Right != nil { root1.Right = root2.Right } }
|