题目描述
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/ \
4 5
/ \ \
5 4 7
注意: 合并必须从两个树的根节点开始。
解题思路
采用stack 存取二叉树取代递归的方式,减少递归调用函数的时间(上下文存取的时间),对二叉的遍历参考的是前序遍历算法,stack,stack2分别遍历二叉树t1和t2,
代码片段:
coding
else if (tmp->left == NULL && tmp2->left)
tmp->left = tmp2->left ;
保证stack,stack2 push的数据都不为NULL;
时间复杂度O(n) ;空间复杂度O(n);
/**
* 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:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
stack<TreeNode*> stack , stack2 ;
if (t1 == NULL)
return t2 ;
else
{
if (t2 == NULL)
return t1 ;
else
{
stack.push(t1) ;
stack2.push(t2) ;
}
}
TreeNode * tmp = NULL , * tmp2 = NULL ;
while(!stack.empty()){
tmp = stack.top() ;
tmp2 = stack2.top() ;
stack.pop() ;
stack2.pop() ;
tmp->val += tmp2->val ;
if (tmp->left && tmp2->left)
{
stack.push(tmp->left) ;
stack2.push(tmp2->left) ;
}
else if (tmp->left == NULL && tmp2->left)
tmp->left = tmp2->left ;
if(tmp->right && tmp2->right){
stack.push(tmp->right) ;
stack2.push(tmp2->right) ;
}
else if (tmp->right == NULL && tmp2->right)
tmp->right = tmp2->right ;
}
return t1 ;
}
};