虽然尝试总结递归过了,不过遇到递归还是发怵……但是做这两天树的题看二叉树主要还是递归呀……再动脑筋做做题理解递归吧
按位置合并两棵树,同一位置都有节点的话值就取两个值相加,否则一个有一个没有就取有的
思路:用递归
只考虑最简单的情况,结果就是两棵树的位置上的值相加,看代码理解 (这种递归题还得再做)
:最开始的两行也不单单只是基于整棵树看的,而是对每一个子节点在调用函数的时候就都是一棵树,直到最简单的叶子节点,递归就是从这里开始的——如果左树的叶子节点不在就返回右树的这个位置的叶子节点,同理右树;对于上面的点来说,下面的子节点树就都是已经处理好的,这道题中无视即可(其他题中可能要做个连接什么的)
从最简单情况看:就是两个节点,那么新节点就是TreeNode * res = new TreeNode (t1->val + t2->val)
,就完事了,但是稍微清醒一点,事实不是分别只有一个节点造出另一个节点的情况,是有左右节点的,那么左右节点怎么办?——也只要像父节点那么做就行了,mergeTrees(t1->left, t2->left);
,mergeTrees(t1->right, t2->right);
///done
class Solution{
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if(!t1) return t2;
if(!t2) return t1;
TreeNode *res = new TreeNode(t1->val + t2->val);
res->left = mergeTrees(t1->left, t2->left);
res->right = mergeTrees(t1->right, t2->right);
return res;
}
};
问题就是对递归的理解
从根节点到叶子节点和等于一个固定值,那么就可以在根节点开始往下的寻找的遍历中,走过一个节点就将哪个给定值减去节点的值,如果到了叶子节点刚好是剩余的那个给定值就表示找到
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(!root) return false;
if(!root->left && !root->right && root->val == sum) return true;
return hasPathSum(root->left, sum- root->val) ||hasPathSum( root->right, sum- root->val);
}
}
路径不一定以root开头,也不一定以leaf结尾,但是必须连续
递归地,从根节点到子节点的和与给定值比较失败的话,就删除根节点再去和给定值比较
这样考虑的话,会有很多节点进行重复的计算,所以可以用哈希对值进行保存(?这一步,怎么保存,毕竟左右节点得到的和是不一样的吧……///嗷好像是保存路径和及其个数的关系,因为本题只是要求出有这个sum长度路径的路有多少条,并没有让给我们求出来是那几条路。因此我们可以找到一个路径就哈希保存一下,重点就变成了怎样有规律的进行“去根节点”的遍历,递归递归
:0405复习到这边脑子转不动了,差太多了,要快点努力,明天早上AC完这题,其他几题过一遍,然后 接着新的题吧,加油加油,先集中做他个20天一个月的
树的根节点到叶子节点的最小路径长度
随手做笔记:
首先拿到题目之后要确认函数原型,参数类型等等,是否有一些限制
确认边界情况,比如正负数,0,是否超过int范围等等,要把边界情况交代清楚
题目一般来说是有很多种方法的有最优解暴力解之类的,要有看到暴力解能立刻说出时间空间复杂度的能力
“写完之后,自己跑一个case,自己去找bug
算法中常用的英文表述也要准备一下,万一外企,万一就英文面试,不至于太突然
比如暴力解法怎么说,时间复杂度空间复杂度怎么说,用英文表达自己的算法基本的算法……
anyway项目是一定要有的,一定要好好做一个的
冬季实习??
今天是刷力扣刷到想哭的一天啦,换换脑袋,把题做完(还有三题8 9 10 )然后接着上课吧,把第一季看完
第三天一点点绿打卡