1 题目
https://leetcode-cn.com/problems/merge-two-binary-trees/
2 题意
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入:
Tree 1 Tree 2
1 2
/ /
3 2 1 3
/
5 4 7
输出:
合并后的树:
3
/
4 5
/
5 4 7
注意: 合并必须从两个树的根节点开始。
3 思路
author's blog == http://www.cnblogs.com/toulanboy/
该题要求两棵树合并为一颗树。规则是对应位置合并。
思考点:
1、由于要对应位置合并,所以我们遍历二叉树时,需要让这2棵数在遍历过程中处于同一层次的同一个位置。
2、当两棵树,其中一颗树的该位置为空,但另外一棵树的该位置不空,则直接合并这个分支。
解决方案:
1、使用先序遍历,同时遍历时传递两棵树的根节点,让他们时刻处于同一层次(同一深度
)。
2、遍历时额外标注其父亲是谁、标注当前树是其父亲的左孩子还是右孩子,方便处理思考点2
,进行分支合并。
4 代码
//author's blog == http://www.cnblogs.com/toulanboy/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
/*
who: 标记其是父亲的左孩子,还是右孩子
0 --> 左孩子;
1 --> 右孩子
*/
void merge(TreeNode * t1, TreeNode * f1,TreeNode * t2, TreeNode * f2, int who){
if(t1 == NULL && t2 == NULL){//如果2棵树都空,则不用合并
return;
}
if(t1 == NULL){//如果t1空,t2不空。将t2合并到t1(挂靠在t1的父亲下)
if(who == 0) //如果当前树是父亲的左子树
f1->left = t2;//则挂在左边
else
f1->right = t2;
return;
}
if(t2 == NULL){
return;
}
t1->val += t2->val;//如果不是分支合并,则简单合并根节点数值
merge(t1->left, t1, t2->left, t2, 0);//处理左子树
merge(t1->right, t1, t2->right, t2, 1);//处理右子树
}
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
//根节点没有父亲节点,额外处理
if(t1 != NULL && t2 == NULL){
return t1;
}
else if(t1 == NULL && t2 != NULL){
return t2;
}
merge(t1, NULL, t2, NULL, -1);
return t1;
}
};