来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
Hot 100 简单难度
合并二叉树
题目描述
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 :
注意: 合并必须从两个树的根节点开始。
题解
方法一:递归
对这两棵树同时进行前序遍历,并将对应的节点进行合并。在遍历时,如果两棵树的当前节点均不为空,我们就将它们的值进行相加,并对它们的左孩子和右孩子进行递归合并;如果其中有一棵树为空,那么我们返回另一颗树作为结果;如果两棵树均为空,此时返回任意一棵树均可(因为都是空)
复杂度分析
时间复杂度:
O
(
N
)
O(N)
O(N),其中N是两棵树中节点个数的较小值。
空间复杂度:
O
(
N
)
O(N)
O(N),在最坏情况下,会递归 N 层,需要
O
(
N
)
O(N)
O(N) 的栈空间。
方法二:迭代
- 先把两棵树的根节点入栈,栈中的每个元素都会存放两个根节点,并且栈顶的元素表示当前需要处理的节点。
- 在迭代的每一步中,我们取出栈顶的元素并把它移出栈,并将它们的值相加。
- 随后我们分别考虑这两个节点的左孩子和右孩子,如果两个节点都有左孩子,那么就将左孩子入栈;如果只有一个节点有左孩子,那么将其作为第一个节点的左孩子;如果都没有左孩子,那么不用做任何事情。对于右孩子同理。
- 最后我们返回第一棵树的根节点作为答案。
复杂度分析
时间复杂度:
O
(
N
)
O(N)
O(N),其中N是两棵树中节点个数的较小值。
空间复杂度:
O
(
N
)
O(N)
O(N),在最坏情况下,栈中存放N个节点。
代码
C++
/**
* 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) {
if(t1 == NULL)
return t2;
if(t2 == NULL)
return t1;
/*
// 递归
t1->val += t2->val;
t1->left = mergeTrees(t1->left, t2->left);
t1->right = mergeTrees(t1->right, t2->right);
return t1;
*/
//迭代
stack<TreeNode*> s;
s.push(t1);
s.push(t2);
while (!s.empty()){
TreeNode* node2 = s.top();
s.pop();
TreeNode* node1 = s.top();
s.pop();
node1->val = node1->val + node2->val;
if(node1->left == NULL)
node1->left = node2->left;
else if(node1->left != NULL && node2->left != NULL){
s.push(node1->left);
s.push(node2->left);
}
if(node1->right == NULL)
node1->right = node2->right;
else if(node1->right != NULL && node2->right != NULL){
s.push(node1->right);
s.push(node2->right);
}
}
return t1;
}
};
小结
二叉树的遍历,以及栈stack的相关特性:先进后出,FILO;进栈push(),出栈pop(),栈顶元素top()。