IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode 617.合并二叉树 C++ -> 正文阅读

[数据结构与算法]LeetCode 617.合并二叉树 C++

题目描述

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为?NULL 的节点将直接作为新二叉树的节点。

示例?1:

输入:?
?? ?Tree 1 ? ? ? ? ? ? ? ? ? ? Tree 2 ? ? ? ? ? ? ? ? ?
? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ? ? ? 2 ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ?/ \ ? ? ? ? ? ? ? ? ? ? ? / \ ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? 3 ? 2 ? ? ? ? ? ? ? ? ? ? 1 ? 3 ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?/ ? ? ? ? ? ? ? ? ? ? ? ? ? \ ? \ ? ? ? ? ? ? ? ? ? ? ?
? ? ? 5 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4 ? 7 ? ? ? ? ? ? ? ? ?
输出:?
合并后的树:
?? ? ? ? 3
?? ? ? ?/ \
?? ? ? 4 ? 5
?? ? ?/ \ ? \?
?? ? 5 ? 4 ? 7
注意:?合并必须从两个树的根节点开始。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-binary-trees

解题思路

用BFS扫树,左边用队列q1来记录扫的结点,右边用队列q2来记录扫的结点,队列qr用来记录合并之后的结点。
在主函数中:
首先特判三种情况:
1.左树与右树都为空,直接return NULL
2.左树为空,右树非空,直接return 右树
3.左树非空,右树为空,直接return 左树
4.否则的话BFS扫一遍两棵树,然后将对应结点加起来,返回到新树res中。

在BFS函数中:
1.首先将三棵树的头结点都入队,res树的话,在主函数中定义了,取左右树根节点的和。root1入q1,root2入q2,res入qr。
2.用p1,p2,p3分别指向q1.front,q2.front,qr.front。
3.如果p1的左孩子和p2的左孩子都非空,那么pr的左孩子就是p1的左孩子+p2的左孩子。把他们分别入到自己的队列中,接着扫。
如果p1的右孩子和p2的右孩子都非空,那么pr的右孩子就是p1的右孩子+p2的右孩子。把他们入队,接着扫。
4.如果p1的左孩子为空,p2的左孩子非空,那么直接把pr的左孩子记为p2的左孩子。不用入队
如果p1的左孩子非空,p2的左孩子为空,那么直接把pr的左孩子记为p1的左孩子。不用入队
如果p1的右孩子为空,p2的右孩子非空,那么直接把pr的右孩子记为p2的右孩子。不用入队
如果p1的右孩子非空,p2的右孩子为空,那么直接把pr的右孩子记为p1的右孩子。不用入队

代码

/**
 * 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:
    void bfs(TreeNode* root1 , TreeNode* root2, TreeNode* &res){
       queue<TreeNode*> q1; //用来记录root1的结点
       queue<TreeNode*> q2;//用来记录root2的结点
       queue<TreeNode*> qr;//用来记录res的结点
       q1.push(root1);  //头结点入队
       q2.push(root2);//头结点入队
       qr.push(res);//头结点入队
       while(!q1.empty()&&!q2.empty()){
           TreeNode* p1=q1.front(); //p1记录当前结点
           TreeNode* p2=q2.front();//p2记录当前结点
           TreeNode* pr=qr.front();//pr记录当前结点
           q1.pop();//出队
           q2.pop();//出队
           qr.pop();//出队
           if(p1->left!=NULL&&p2->left!=NULL){  //p1的左孩子和p2的左孩子都非空
               pr->left=new TreeNode(p1->left->val+p2->left->val);  //那他们的左孩子相加,并保存到pr的左孩子中
               q1.push(p1->left);   //入队
               q2.push(p2->left);   //入队
               qr.push(pr->left);   //入队
           }
           if(p1->right!=NULL&&p2->right!=NULL){    //p1的右孩子和p2的右孩子都非空
               pr->right=new TreeNode(p1->right->val+p2->right->val);//那他们的右孩子相加,并保存到pr的右孩子中
               q1.push(p1->right);//入队
               q2.push(p2->right);//入队
               qr.push(pr->right);//入队
           }
           if(p1->left==NULL&&p2->left!=NULL){  //p1的左孩子为空,p2的左孩子非空
               pr->left=p2->left;//那么pr的左孩子就直接是p2的左孩子
           }
           if(p1->left!=NULL&&p2->left==NULL){//p1的左孩子非空,p2的左孩子为空
               pr->left=p1->left;//那么pr的左孩子就直接是p1的左孩子
           }
           if(p1->right==NULL&&p2->right!=NULL){//p1的右孩子为空,p2的右孩子非空
               pr->right=p2->right;//那么pr的右孩子就直接是p2的右孩子
           }
           if(p1->right!=NULL&&p2->right==NULL){//p1的右孩子非空,p2的右孩子为空
               pr->right=p1->right;//那么pr的右孩子就直接是p1的右孩子
           }
       } 
    }
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1==NULL&&root2==NULL){   //特判,左树和右树全空,直接return NULL
            return NULL;
        }
        if(root1==NULL&&root2!=NULL){   //特判,左树为空,右树非空,直接return 右树
            return root2;
        }
        if(root1!=NULL&&root2==NULL){   //特判,左树非空,右树为空,直接return 左树
            return root1;
        }
        TreeNode* res=new TreeNode(root1->val+root2->val);  //否则的话就要开始扫了,首先定义新树的头结点为前面的左树和右树的头结点的和
        bfs(root1,root2,res);   //然后bfs扫一遍,并且把结果返回给res
        return res;
    }
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:48:54  更:2021-08-24 15:49:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:51:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码