回顾总结一周
2月20日
654. 最大二叉树
本题思路没有那么好了,下次再复习回顾这道题的时候还要再做。
617.合并二叉树
能直接想到创建一颗新树来遍历对应相加。直接做出来。
700.二叉搜索树中的搜索
比较简单二叉搜索树的特性直接解决,牢记二叉搜索树的概念即可。
二叉搜索树的概念:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉搜索树
98.验证二叉搜索树
[2,2,2] 这个测试案例错了好几次,这一点强调了判断条件: pre->val >= root->val
很关键
2月21日
530.二叉搜索树的最小绝对差
递归函数不应该使用返回值,这里需要注意。
501.二叉搜索树中的众数
处理众数第一个节点的时候是 if (pre == nullptr) count = 1;
而不是 != ,这里需要注意。
236. 二叉树的最近公共祖先
短时间没有解决这道题,可能需要加强理解。(需要解决的)
2月22日
235. 二叉搜索树的最近公共祖先
比235那题简单些,因为二叉搜索树有序
701.二叉搜索树中的插入操作
还是对什么时候需要返回值不是很清楚,在本题中不熟练。
450.删除二叉搜索树中的节点
五种情况,在书写过程中注意递归三部曲别忘记了。最好是写着注释跟着走。
2月23日
669. 修剪二叉搜索树 (解决得不够顺)
一样的问题,思路不够明确,还是看注解完成的,后面还要重做本题,加强理解
108.将有序数组转换为二叉搜索树
注意new节点里面不是mid下标,而是mid下标对应得数组值,然后注意循环不变量。
538.把二叉搜索树转换为累加树
右中左的遍历递归过程。
2月24日
这一天主要是学习回溯算法,学习模板。
77. 组合
套模板 + 剪枝
2月25日
216.组合总和III
直接使用 n 来控制的时候,不要忘记对n<0的情况做剪枝
17.电话号码的字母组合(这道题一直做起来没感觉,都是靠题解过的,如果我还是做不出来就背下来吧)
理解本题后,要解决如下三个问题:
数字和字母如何映射
两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来
输入1 * #按键等等异常情况
数字和字母如何映射:
可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射,我这里定义一个二维数组,代码如下:
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
回溯法来解决n个for循环的问题:
int digit = digits[index] - '0'; // 将index指向的数字转为int
string letters = letterMap[digit]; // 取数字对应的字符集
for (int i = 0; i < letters.size(); i++) {
s.push_back(letters[i]); // 处理
backtracking(digits, index + 1); // 递归,注意index+1,一下层要处理下一个数字了
s.pop_back(); // 回溯
}