今天要面试,所以只做了两道题
BM32 合并二叉树
已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。
数据范围:树上节点数量满足 0≤n≤5000≤n≤500,树上节点的值一定在32位整型范围内。
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
思考:
一开始没写出来,一看题解发现自己想麻烦了。
这类题目有一种思路就是不用建成一个新树,只要跟着指针走能遍历到新树就可以了。
对两棵树一起前序遍历然后输出就好。
代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param t1 TreeNode类
* @param t2 TreeNode类
* @return TreeNode类
*/
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
// write code here
if (!t1 && !t2) return nullptr;
if (!t1) return t2;
if (!t2) return t1;
// t1->val += t2->val;
TreeNode *tmp = new TreeNode(t1->val + t2->val);
tmp->left = mergeTrees(t1->left, t2->left);
tmp->right = mergeTrees(t1->right, t2->right);
return tmp;
}
};
BM33 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 0≤n≤10000≤n≤1000 , 二叉树每个节点的值 0≤val≤10000≤val≤1000
要求: 空间复杂度 O(n)O(n) 。本题也有原地操作,即空间复杂度 O(1)O(1) 的解法,时间复杂度 O(n)O(n)
思考:
要对二叉树进行镜像,其本质就是交换左右子树。因此应当在已经处理了,左右子树之后,在对根节点进行左右子树的互换,所以选择后续遍历。
代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
void post(TreeNode* root) {
if (!root) return;
post(root->left);
post(root->right);
TreeNode* tmp = root->left;
root->left = root->right;
root->right = tmp;
return;
}
TreeNode* Mirror(TreeNode* pRoot) {
// write code here
post(pRoot);
return pRoot;
}
};