很简单的一个递归嘛,我就建了一颗新树
/**
* 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:
void hebing(TreeNode *t, TreeNode *t1, TreeNode *t2)
{
t->val = 0;
if (t1 && t2)
{
t->val = t1->val + t2->val;
if (t1->left || t2->left)
{
t->left = new TreeNode;
hebing(t->left, t1->left, t2->left);
}
if (t1->right || t2->right)
{
t->right = new TreeNode;
hebing(t->right, t1->right, t2->right);
}
}
if (t1 && t2 == NULL)
{
t->val = t1->val;
if (t1->left)
{
t->left = new TreeNode;
hebing(t->left, t1->left, NULL);
}
if (t1->right)
{
t->right = new TreeNode;
hebing(t->right, t1->right, NULL);
}
}
if (t2 && t1 == NULL)
{
t->val = t2->val;
if (t2->left)
{
t->left = new TreeNode;
hebing(t->left, NULL, t2->left);
}
if (t2->right)
{
t->right = new TreeNode;
hebing(t->right, NULL, t2->right);
}
}
}
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL)
{
//printf("fs");
if (t2 == NULL) return NULL;
else return t2;
}
if (t2 == NULL) return t1;
TreeNode *root = new TreeNode;
//printf("%d\n", root->val);
hebing(root, t1, t2);
return root;
}
};
可以看到这个TreeNode写了个初始化函数嘛,可以直接TreeNode root(0);
但是TreeNode指针是不能这样初始化的。
建新树是这样写的嘛TreeNode *root = new TreeNode;
但是我一开始写的是TreeNode *root;
我以为这样就行了_(:з」∠)_ 实际上指针指向的对象是不确定的。
如此naive的原因是new我以前没学过,刚查了一下应该是c++新的动态分配内存的方式,和malloc相比不仅分配了内存还创建了对象。等我好好学学在指针笔记里面详说吧。
下面这个是我一开始写的hebing函数,给的warning是访问到了空指针,你们能发现问题在哪里嘛
void hebing(TreeNode *t, TreeNode *t1, TreeNode *t2)
{
t->val = 0;
if (t1)
{
t->val += t1->val;
}
if (t2)
{
t->val += t2->val;
}
if (t1->left || t2->left)
{
t->left = new TreeNode;
hebing(t->left, t1->left, t2->left);
}
if (t1->right || t2->right)
{
t->right = new TreeNode;
hebing(t->right, t1->right, t2->right);
}
}
对,原因是t1可能是空的,这时候再访问t1->left就会出错(t2、right同理)。虽然我在一开始判断了t1、t2是否为空,但是要注意是不是它可能是空的你还去访问它的指针了。
很简单的一道题,但是暴露出来了很多问题,还是指针学的不好,不过在补了在补了_(:з」∠)_ 感觉比以前要清楚一丢丢了!
官方的代码,好妙!
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if (t1 == null) {
return t2;
}
if (t2 == null) {
return t1;
}
TreeNode merged = new TreeNode(t1.val + t2.val);
merged.left = mergeTrees(t1.left, t2.left);
merged.right = mergeTrees(t1.right, t2.right);
return merged;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/merge-two-binary-trees/solution/he-bing-er-cha-shu-by-leetcode-solution/