二叉树之合并二叉树和二叉搜索树

发布于:2024-05-17 ⋅ 阅读:(122) ⋅ 点赞:(0)

题目:

给你两棵二叉树: 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;
    }
};