本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。
关于二叉树,再难也不过与先序、中序、后序、层序遍历,大多是递归法(回溯法),只有层序遍历不是(运用了队列)。
解题思路:
合并两颗二叉树———>操作某节点后,需要再合并其左子树和右子树———>果断递归法。
若t1和t2均为空,则递归结束,作为递归结束条件;
若t1为空,t2不为空,创建值为t2的节点,再递归t2的左右孩子;
若t1不为空,t2为空,创建值为t1的节点,再递归t1的左右孩子;
若均不为空,创建值为t1 + t2的节点,递归要考虑两者的左右孩子;
注释代码举了Example中的例子
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
//如Tree 1的节点2和Tree 2节点3的左孩子均是NULL,作为递归结束条件
if(t1 == NULL && t2 == NULL){
return NULL;
}
TreeNode* node = (TreeNode*) malloc(sizeof(struct TreeNode));
if(t1 == NULL){ //如Tree 1的节点3无右孩子,但Tree 2节点1有
node->val = t2->val;
node->left = mergeTrees(NULL, t2->left); //递归t2的左子树
node->right = mergeTrees(NULL, t2->right); //递归t2的右子树
}
else if(t2 == NULL){ //如Tree 1的节点3有左孩子,但Tree 2节点1没有
node->val = t1->val;
node->left = mergeTrees(t1->left, NULL);
node->right = mergeTrees(t1->right, NULL);
}
else{ //如两颗二叉树的头结点1和2
node->val = t1->val + t2->val;
node->left = mergeTrees(t1->left, t2->left); //同时递归t1和t2的左子树
node->right = mergeTrees(t1->right, t2->right); //同时递归t1和t2的右子树
}
return node; //返回节点
}
};
能不能再简单点?
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if(!t1){ //此时不管t2是不是空,都符合要求,若t2非空,返回t2并且传递了其左右子树
return t2;
}
if(!t2){
return t1;
}
return new TreeNode(t1->val + t2->val, mergeTrees(t1->left, t2->left), mergeTrees(t1->right, t2->right)); //返回节点
}
java版本
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if(t1 == null){
return t2;
}
if(t2 == null){
return t1;
}
return new TreeNode(t1.val + t2.val, mergeTrees(t1.left, t2.left), mergeTrees(t1.right, t2.right));
}