首页 > 其他分享 >合并二叉树

合并二叉树

时间:2023-08-19 09:45:38浏览次数:39  
标签:right 合并 nullptr 二叉树 && left root1 root2

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

经验1:

程序写在递归函数前面代表压栈的时候实现,也就是说浏览到这个结点的时候实现

程序写在递归函数后面代表弹栈的时候实现,也就是下一次递归结束后在本次递归函数中实现

那么到底是压栈的时候实现还是弹栈的时候实现呢,这要看对根节点的操作会不会对子节点的操作造成影响,如果会造成影响那么一定要在弹栈的时候实现,这也是下面的代码出错的原因。

下面代码为什么出错呢:原因是我将“如果tree1这个位置上的结点如果为空,tree2这个位置上的结点不为空,那么将tree2这个位置的结点填到tree1这个位置上去”这段程序写到递归之前了,那么这就导致对根节点的操作对子节点的操作造成了影响:

 

注意对返回值的操作也属于写在递归后

也就是只有下一层的递归执行完了才会由返回值返回给这一层

 

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     void process(TreeNode* root1, TreeNode* root2){
15         if(root1->left==nullptr&&root2->left==nullptr&&root1->right==nullptr&&root2->right==nullptr) return;
16         if(root1->left!=nullptr&&root2->left!=nullptr) root1->left->val+=root2->left->val;
17         if(root1->left!=nullptr&&root2->left==nullptr) root1->left->val=root1->left->val;
18         if(root1->left==nullptr&&root2->left!=nullptr) root1->left=root2->left;
19         if(root1->right!=nullptr&&root2->right!=nullptr) root1->right->val+=root2->right->val;
20         if(root1->right!=nullptr&&root2->right==nullptr) root1->right->val=root1->right->val;
21         if(root1->right==nullptr&&root2->right!=nullptr) root1->right=root2->right;
22 
23         if(root1->left&&root2->left) process(root1->left,root2->left);
24         if(root1->right&&root2->right) process(root1->right,root2->right);
25     }
26     TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
27        if(root1==nullptr&&root2==nullptr) return root1;
28        else if(root1!=nullptr&&root2==nullptr) return root1;
29        else if(root1==nullptr&&root2!=nullptr) return root2;
30        else root1->val+=root2->val;
31        process(root1,root2);
32        return root1;
33     }
34 };

经验2:

如何实现子结点和父节点一起操作呢,首先在子节点的递归中是行不通的,那么只能将子节点返回到父节点的递归中这个时候可以在父节点的递归中实现对子节点和父节点的同时操作:

 

标签:right,合并,nullptr,二叉树,&&,left,root1,root2
From: https://www.cnblogs.com/Sandals-little/p/17642084.html

相关文章

  • 阿里云不同主体账号合并ECS主机资源迁移记录
    迁移记录需求A账号和B账号是不同的阿里云认证主体,要求A账号下的资源要迁移到B账号下,方便统一管理。A账号资源vpc:10.0.0.0/8B账号资源vpc:172.16.0.0/12A账号和B账号已做了vpc对等连接。操作步骤1.A账号:修改A账号的认证主体为B账号的认证主体,否则不能进行迁移......
  • 剑指 Offer 34. 二叉树中和为某一值的路径
    dfsclassSolution{public:vector<vector<int>>res;vector<int>tmp;voiddfs(TreeNode*node,inttarget){if(node==nullptr)return;target-=node->val;tmp.emplace_back(node->val);......
  • .net5 npoi扩展 获取单元格合并区域
    核心逻辑为通过sheet.GetMergedRegion(i)获取所有的合并区域信息,随后检测单元格是否在此区域内新增对象识别合并单元格的开始、结束位置///<summary>///获取指定行列的数据///</summary>///<paramname="row"></param>///<paramname......
  • Spring高手之路12——BeanDefinitionRegistry与BeanDefinition合并解析
    1.什么是BeanDefinitionRegistry?  BeanDefinitionRegistry 是一个非常重要的接口,存在于 Spring 的 org.springframework.beans.factory.support 包中,它是 Spring 中注册和管理 BeanDefinition 的核心组件。 BeanDefinition。在 Spring 中,一个 Bean 就是一个被 Sp......
  • 判断是否为完全二叉树
    利用层次遍历思想,但结点是否为空不影响入队。当出队时,该结点为空,若队列中仍有不为空的结点,则不是完全二叉树空树也是完全二叉树#include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructNode{intdata;structNode*lchild,*rchild;}TreeNode......
  • 如何合并图形并共享同一个图例?
     001、加载R包library(tidyverse)library(ggplot2)library(viridis) 02、生成基本图形plot1<-ggplot(data=mpg,aes(x=displ,y=hwy,color=class))+geom_point(size=1.7)+scale_color_viridis(discrete=T)+theme_bw()+theme(panel.grid=......
  • 【剑指Offer】61、序列化二叉树
    【剑指Offer】61、序列化二叉树题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。解题思路:序列化是指将结构化的对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指将字节流转回结构化的对象的过程,是序列化的逆过程。受第4题:重建二叉树的启......
  • 平衡二叉树
    110.平衡二叉树-力扣(LeetCode)确定思路如果左右子树都是平衡二叉树,并且左右子树的高度相差不超过1,那么就是平衡二叉树,如果左子树不是平衡二叉树也就不用对右子树进行递归了确定终止条件应该是遍历到叶子节点,因为叶子节点不能构成二叉树了,因为就没有再往下遍历的必要了——......
  • 剑指 Offer 07. 重建二叉树(中等)
    题目:classSolution{//本题思路:利用中序遍历,从前序遍历中找到左、右子树的根节点public:unordered_map<int,int>dic;//创建字典,映射当前根节点在中序遍历中的位置,以便于划分当前根节点的左右子树vector<int>preorder;//即下面的this->preorder......
  • [代码随想录]Day20-二叉树part09
    题目:669.修剪二叉搜索树思路:遍历到的值小于最小值,说明左子树里的所有节点都小于最小值,舍弃左子树。遍历到的值大于最大值,说明右子树里的所有节点都大于最大值,舍弃右子树。如果在范围内,就拼接左右子树然后返回节点代码:/***Definitionforabinarytreenode.*typeTr......