今日心情:为了offer冲冲冲!
题目描述:
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
解题代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
//首先肯定递归实现
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null){
return root2;
}
if(root2 == null){
return root1;
}
TreeNode meg = new TreeNode(root1.val + root2.val);
meg.left = mergeTrees(root1.left,root2.left);
meg.right = mergeTrees(root1.right,root2.right);
return meg;
}
}
解题思路:
对于树用的基本上都是递归然后根据具体情况,看是带返回值的递归还是不用带返回值的递归。
(1)几种情况需要考虑:
-- 头节点值相加(新建头节点TreeNode meg = new TreeNode(root1.val + root2.val))
-- 如果当A前头节点的左节点为空,同时B左节点为空,则合并后当前位置节点的左右节点均为空
-- 如果当A前节点的左节点为空,而B左节点不为空,则合并后当前位置节点的左节点为B;同理右边的情况也是。所以递归的时候,如果节点A为空,而节点B不为空,则返回B,相反A不为空,B为空的时候,返A作为合并节点。
-- 递归实现:(更新条件)
meg.left = mergeTrees(root1.left,root2.left);左节点递归
meg.right = mergeTrees(root1.right,root2.right);右节点递归