/**
* 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
//使用后序遍历的方式解决此题
//递归出口
if(t1==nullptr)//如果t1为空了,直接返回t2,t2下面的结点也不用处理了
return t2;
if(t2==nullptr)
return t1;
//递归处理左右结点
TreeNode* leftNode=mergeTrees(t1->left, t2->left);
TreeNode* rightNode=mergeTrees(t1->right,t2->right);
//左右孩子已经遍历合并完成
//合并当前结点
t1->val+=t2->val;
//连接到t1上
t1->left=leftNode;
t1->right=rightNode;
return t1;
}
};
此题使用后序遍历的方法解决,在思路上前序遍历也是可以的,相当于先合并根结点,在递归合并他的左右子树。
前序遍历代码
t1->val+=t2->val;
TreeNode* leftNode=mergeTrees(t1->left, t2->left);
TreeNode* rightNode=mergeTrees(t1->right,t2->right);
t1->left=leftNode;
t1->right=rightNode;
无论是那种遍历只要保证递归出口正确,子问题操作与原问题相同即可



京公网安备 11010502036488号