1.题目
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not.
You need to merge them into a new binary tree. The merge rule is that if two nodes overlap, then sum node values up as the new value of the merged node. Otherwise, the NOT null node will be used as the node of new tree.
翻译:给定两个二叉树,并且想象你用一个二叉树覆盖另一个,一些节点重合了,一些没有。你需要把它们合并进一个新的二叉树。合并规则是如果两个节点重合了,就把两个节点的和赋值给新的合并节点。否则,非空节点被应用在新的二叉树上。
Example 1:
Input: Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 Output: Merged tree: 3 / \ 4 5 / \ \ 5 4 7
Note: The merging process must start from the root nodes of both trees.
提示:合并过程必须从两棵树的根结点开始。
2.思路
从根节点开始,两棵树对应着先序遍历,将t1树进行更新,作为要返回的结果。
①两个树对应位置的节点都空,则返回空;
②一个节点空,一个节点不空,返回非空的节点;
③两个节点都不空,更新该节点的值(两节点数据域的和),更新其左子树,右子树。(递归)
3.算法
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if(t1==null&&t2==null)return null;
if(t1!=null&&t2==null)return t1;
if(t1==null&&t2!=null)return t2;
t1.val+=t2.val;
t1.left=mergeTrees(t1.left,t2.left);
t1.right=mergeTrees(t1.right,t2.right);
return t1;
}
}
4.总结
开始的时候,这两句,只写了两个mergeTrees操作,忘记把返回结果赋值给t1了(也就是树断了)。
t1.left=mergeTrees(t1.left,t2.left);
t1.right=mergeTrees(t1.right,t2.right);
写成了
mergeTrees(t1.left,t2.left);
mergeTrees(t1.right,t2.right);