十四天算法快速入门第八天之「广度优先搜索 / 深度优先搜索」

写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~

目录

题目一:617. 合并二叉树 

题目描述:

题目分析:

题解代码:

题目二:116. 填充每个节点的下一个右侧节点指针

题目描述:

题目分析:

题解代码:


题目一:617. 合并二叉树 

题目描述:

题目分析:

这里我们将一棵二叉树合并到另一棵上即可,详细过程见代码注释。

题解代码:

/**
 * 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* root1, TreeNode* root2) {
        if(root1==NULL)  //去除NULL的部分
            return root2;
        if(root2==NULL)
            return root1;
        
        //将root2合并到root1上
        root1->val+=root2->val; //根节点
        root1->left=mergeTrees(root1->left,root2->left);  //左节点
        root1->right=mergeTrees(root1->right,root2->right);  //右节点
        
        return root1;
    }
};

题目二:116. 填充每个节点的下一个右侧节点指针

题目描述:

题目分析:

首先是判断两种指向NULL的情况,树为空或者节点无孩子。其次再进行孩子节点next指针的连接,详细过程见代码注释。

题解代码:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        if(root==NULL || root->right==NULL)  //两种节点为空的情况
            return root;

        if(root->right!=NULL)  //左子树中某节点若有右孩子,则将其左孩子的next指针指向右孩子
            root->left->next=root->right;

        if(root->next!=NULL)  //右子树中若该节点的next指针已经建立好了,即已经指向了自己的兄弟,则它的右孩子的next指针便指向自己兄弟节点的左孩子
            root->right->next=root->next->left;

        connect(root->left);  //递归处理剩下的节点
        connect(root->right);

        return root;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kano_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值