二叉树:合并两个二叉树( 二 )
「但是前序遍历是最好理解的 , 我建议大家用前序遍历来做就OK 。 」
如上的方法修改了t1的结构 , 当然也可以不修改t1和t2的结构 , 重新定一个树 。
不修改输入树的结构 , 前序遍历 , 代码如下:
class Solution {public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if (t1 == NULL) return t2;if (t2 == NULL) return t1;// 重新定义新的节点 , 不修改原有两个树的结构TreeNode* root = new TreeNode(0);root->val = t1->val + t2->val;root->left = mergeTrees(t1->left, t2->left);root->right = mergeTrees(t1->right, t2->right);return root;}};迭代法使用迭代法 , 如何同时处理两棵树呢?
思路我们在二叉树:我对称么? 中的迭代法已经讲过一次了 , 求二叉树对称的时候就是把两个树的节点同时加入队列进行比较 。
本题我们也使用队列 , 模拟的层序遍历 , 代码如下:
class Solution {public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if (t1 == NULL) return t2;if (t2 == NULL) return t1;queue que;que.push(t1);que.push(t2);while(!que.empty()) {TreeNode* node1 = que.front(); que.pop();TreeNode* node2 = que.front(); que.pop();// 此时两个节点一定不为空 , val相加node1->val += node2->val;// 如果两棵树左节点都不为空 , 加入队列if (node1->left != NULLque.push(node2->left);}// 如果两棵树右节点都不为空 , 加入队列if (node1->right != NULLque.push(node2->right);}// 当t1的左节点 为空 t2左节点不为空 , 就赋值过去if (node1->left == NULL}// 当t1的右节点 为空 t2右节点不为空 , 就赋值过去if (node1->right == NULL}}return t1;}};拓展当然也可以秀一波指针的操作 , 这是我写的野路子 , 大家就随便看看就行了 , 以防带跑遍了 。
如下代码中 , 想要更改二叉树的值 , 应该传入指向指针的指针 。
代码如下:(前序遍历)
class Solution {public:void process(TreeNode** t1, TreeNode** t2) {if ((*t1) == NULLif ((*t1) != NULL}if ((*t1) == NULLreturn;}if ((*t1) != NULL}process(process(}TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {process(return t1;}};总结合并二叉树 , 也是二叉树操作的经典题目 , 如果没有接触过的话 , 其实并不简单 , 因为我们习惯了操作一个二叉树 , 一起操作两个二叉树 , 还会有点懵懵的 。
这不是我们第一次操作两颗二叉树了 , 二叉树:我对称么? 中也一起操作了两棵二叉树 。
迭代法中 , 一般一起操作两个树都是使用队列模拟类似层序遍历 , 同时处理两个树的节点 , 这种方式最好理解 , 如果用模拟递归的思路的话 , 要复杂一些 。
最后拓展中 , 我给了一个操作指针的野路子 , 大家随便看看就行了 , 如果学习C++的话 , 可以在去研究研究 。
就酱 , 学到了的话 , 就转发给身边需要的同学吧!
-------end-------
我将算法学习相关的资料已经整理到了
Github : , 里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图 , 可以fork到自己仓库有空看一看一定会有所收获 , 顺便给一个star支持一下吧!
我是程序员Carl , 哈工大师兄 , 先后在腾讯和百度打杂 , 这里每天8:35准时推送一道经典算法题目 , 我选择的每道题目都不是孤立的 , 而是由浅入深 , 环环相扣 , 帮你梳理算法知识脉络 , 轻松学算法!
@代码随想录 期待你的关注
推荐阅读
- 最壕“年终奖”出炉!雷军下血本:一次颁发两个百万美金技术大奖
- 估值超180亿美元 东南亚网约车Gojek拟与电商Tokopedia合并
- 小米又申请了两个环绕屏设计专利:这次能最终量产吗?
- 苹果iPhone12卖了两个月之后,“果粉”的差评很真实
- 小冰将演绎未来科幻世界:两个世界同一个人工智能同步交互
- Linux 5.11窗口合并期今天结束 引入大量新特性和改进
- 中国移动的两个“老板”号段,如今罕见稀有,如果有、别轻易注销
- 又紧张了?两个糟糕消息传来!花124亿只为换掉华为中兴设备?
- 特斯拉最黑暗时刻曾寻求苹果收购;欧盟批准FCA和PSA合并;商用车产销大幅跑赢行业平均
- 美国打压无效了?华为传来三个好消息,有两个和Mate40关联
