题目:
给你两棵二叉树: root1
和 root2
。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
先说说收获吧:
做了这道题目后,更加深了我对递归的理解(尤其是带返回值的)
每次递归的返回值只于当前接收返回值有关。
也就是说当用一个left接收order()的返回值时,在order中有创建了一个left和right
而这里的接收的left在order中就是传入的root,这点要搞清楚
然后就是终止条件了,开始我对终止条件还是很模糊的,现在更加清晰,然后我将通过文字来描述二叉树中递归的全过程
首先确定好终止条件(我开始以为遇到终止条件就一定是到了叶子节点位置了,其实这个话看上去是对了,但是如果细扣就不太对了,但大部分也都对,我之前理解有错误)
后来我想了一会,发现是我对递归中看的不全面,有时候看到左节点就会忘记思考右节点了。
重点:递归叶子到最底端时,并非调用终止条件就到最后一个递归函数了,而是当每一个递归函数都调用了一次终止条件时,才能判断到最底端。
所以看待递归时可以看出两部分:第一是去往最深处部分,第二是返回最高处部分
返回最高处时也要考虑一个return的接收值,因为终止条件是对底部或者快到底部的一个return,而我们肯定要return一个非底部,也就是中部的内容,比如说return root(当前节点)看上去是root实际上是上一个节点的left或者right
也就是下去时是每个递归函数是一分为二,而回来时是合二为一
那么看代码吧:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2)
{
if(root1 == nullptr)return root2;
if(root2 == nullptr)return root1;
root1 -> val += root2->val;
root1->left = mergeTrees(root1->left,root2->left);
root1->right = mergeTrees(root1->right,root2->right);
return root1;
}
};
下面是第二题
给定二叉搜索树(BST)的根节点 root
和一个整数值 val
。
你需要在 BST 中找到节点值等于 val
的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null
。
示例 1:
输入:root = [4,2,7,1,3], val = 2 输出:[2,1,3]
示例 2:
输入:root = [4,2,7,1,3], val = 5 输出:[]
写的有点累不想写了,直接看代码吧
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val)
{
if(root == nullptr || root->val == val)return root;
TreeNode* result = nullptr;
if(root->val>val)result = searchBST(root->left,val);
if(root->val<val)result = searchBST(root->right,val);
return result;
}
};