欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 617. 合并二叉树 思考分析

发布时间:2023/12/1 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 leetcode 617. 合并二叉树 思考分析 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

思路1:递归遍历两棵树,构造一棵新的树

1、递归参数以及返回值
返回值:新树的结点
参数:两棵旧树
2、终止条件
两棵旧树的对应的该结点都为NULL
3、逻辑(这里直接贴代码和遇到的问题)
首先将情况分为4类:
如果t1 和t2 都是空结点,那么说明新树的这个结点也是NULL
如果t1 t2中一个位空一个不为空,我们可以直接将其中不为空的一个结点的信息直接传给新结点
如果t1 t2全部存在,那么将结点值相加,传给新结点。
注意当进行递归调用traversal时:
如traversal(t1->left,t2->left);:必须要保证t1、t2都不为空,否则编译器会报错。
member access within null pointer of type 'TreeNode'

/*** 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* traversal(TreeNode* t1, TreeNode* t2){if(t1 == NULL && t2 == NULL) return NULL;int rootVal=0;if(t1 ==NULL && t2!=NULL) {rootVal = t2->val;TreeNode* NewRoot = new TreeNode(rootVal);NewRoot->left = t2->left;NewRoot->right = t2->right;return NewRoot;}else if(t1 !=NULL && t2==NULL){rootVal = t1->val;TreeNode* NewRoot = new TreeNode(rootVal);NewRoot->left = t1->left;NewRoot->right = t1->right;return NewRoot;} else{rootVal = t1->val + t2->val;TreeNode* NewRoot = new TreeNode(rootVal);NewRoot->left = traversal(t1->left,t2->left);NewRoot->right = traversal(t1->right,t2->right);return NewRoot;} }TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {return traversal(t1,t2);} };

思路2:层序遍历两棵树,构造一棵新的树

在LeetCode 101. 对称二叉树 思考分析中,有过利用队列同时遍历两棵树的经历,这里回顾了一下,然后直接上。
这里完全是基于t1来的,当不重叠的时候,直接将t2的结点直接作为t1的节点,结点与孩子的关系也被传给t1了。

class Solution { public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if(t1 == NULL && t2==NULL) return NULL;else if(t1 == NULL && t2!=NULL) return t2;else if(t1 != NULL && t2==NULL) return t1;queue<TreeNode*> que;que.push(t1); que.push(t2); while(!que.empty()) {TreeNode* T1Node = que.front();que.pop();TreeNode* T2Node = que.front();que.pop();//此时两个结点一定不为空T1Node->val += T2Node->val;//如果两棵树左结点都不为空,加入队列if(T1Node->left && T2Node->left){que.push(T1Node->left);que.push(T2Node->left);}//如果两棵树右结点都不为空,加入队列if(T1Node->right && T2Node->right){que.push(T1Node->right);que.push(T2Node->right);}//当t1的某个结点为空时且t2的结点不为空,不入队列//当t1左结点为空,t2左结点不为空if(!T1Node->left && T2Node->left){T1Node->left = T2Node->left;}if(!T1Node->right && T2Node->right){T1Node->right = T2Node->right;}} return t1;} };

总结

以上是生活随笔为你收集整理的leetcode 617. 合并二叉树 思考分析的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。