C++合并二叉树的思路与示例代码
前言
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
文章图片
思路
1.确定递归函数的参数和返回值:
首先那么要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。
代码如下:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2)2.确定终止条件:
因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了啊(如果t2也为NULL也无所谓,合并之后就是NULL)。
反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。
代码如下:
if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t23.确定单层递归的逻辑:
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
单层递归的逻辑就比较好些了,这里我们用重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。
那么单层递归中,就要把两棵树的元素加到一起。
t1->val += t2->val;
接下来t1 的左子树是:合并 t1左子树 t2左子树之后的左子树。
t1 的右子树:是 合并 t1右子树 t2右子树之后的右子树。
最终t1就是合并之后的根节点。
/** * 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==nullptr) return root2; if(root2==nullptr) return root1; // 修改了t1的数值和结构root1->val+=root2->val; root1->left=mergeTrees(root1->left,root2->left); root1->right=mergeTrees(root1->right,root2->right); return root1; }};
附:新建一颗树
不破坏原有两颗树结构
/** * Definition for a binary tree node. * struct TreeNode { *int val; *TreeNode *left; *TreeNode *right; *TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if(!t1&&!t2)return NULL; TreeNode* node=new TreeNode(0); node->val=(t1? t1->val:0)+(t2? t2->val:0); node->left=mergeTrees((t1? t1->left: NULL),(t2? t2->left:NULL)); node->right=mergeTrees((t1? t1->right: NULL),(t2? t2->right : NULL)); return node; }};
总结
【C++合并二叉树的思路与示例代码】到此这篇关于C++合并二叉树的文章就介绍到这了,更多相关C++合并二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- java中如何实现重建二叉树
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- c++基础概念笔记
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- 如何将多个小分子文件合并为单个
- C++Primer之|C++Primer之 函数探幽
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...