今天手顺,又AC一题,又是一道二叉树题。话不多说,上题!
题目描述
已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:
两颗二叉树是:
Tree 1
1
/ \
3 2
/
5
Tree 2
2
/ \
1 3
\ \
4 7
合并后的树为
3
/ \
4 5
/ \ \
5 4 7
一读题,感觉有好多场景要讨论啊,再一读题,这不就是简单加法题么?!一步思路、一步代码,带你两步搞定!
一步思路
题目来来回回、絮絮叨叨,其实就是想让我们做树形加法。
一步代码
按照先序遍历的方式,递归做树形加法,并注意对空节点的处理。
这个代码的精妙之处,在于t1、t2本身是否为空的判断,和省略了t1、t2子树是否为空的判断。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param t1 TreeNode类
* @param t2 TreeNode类
* @return TreeNode类
*/
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
// write code here
TreeNode *root;
TreeNode *t1_newl = NULL;/*t1的左子树*/
TreeNode *t1_newr = NULL; /*t1的右子树*/
TreeNode *t2_newl = NULL; /*t2的左子树*/
TreeNode *t2_newr = NULL; /*t2的右子树*/
if((t1 == NULL)&&(t2 == NULL))/*t1 t2均为空*/
{
root = NULL;
}
else
{
root = new TreeNode(NULL);
root->val = 0;
if(t1 != NULL)
{
root->val += t1->val;/*加上t1的值*/
t1_newl = t1->left;
t1_newr = t1->right;
}
if(t2 != NULL)
{
root->val += t2->val; /*加上t2的值*/
t2_newl = t2->left;
t2_newr = t2->right;
}
root->left = mergeTrees(t1_newl, t2_newl);/*针对左子树,调用递归函数*/
root->right = mergeTrees(t1_newr, t2_newr); /*针对右子树,调用递归函数*/
}
return root;
}
};