leetcode513.找树左下角的值
注意:×
- 注意Queue这个数据结构的继承关系,LinkedList
- 一定一定一定!!!!!!!要注意再while循环中的第一行
int sizee = queue.size();
,这一行非常的重要,因为这里记录的是本轮queue的长度,如果直接使用i<queue.size();
会导致queue一直在下面的for循环中直到所有元素出队列,因为i<queue.size();
是不断在变化的!!!!!!!!!!
public int findBottomLeftValue(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
int res = 0;
queue.add(root);
while (!queue.isEmpty()){
int sizee = queue.size();
for (int i = 0; i<sizee;i++){
TreeNode tmp = queue.poll();
if (i == 0){res = tmp.val;}
if (tmp.left!= null){queue.add(tmp.left);}
if (tmp.right!= null){queue.add(tmp.right);}
}
}
return res;
}
leetcode112. 路径总和
注意:×
- 应该可以使用Labuladong说的traverse+外部变量解决,但是反复出问题,选择放弃,学习新的答案
- 自己写的错误1:不知道什么时候返回,当值已经是答案的时候没法跳出来,其实还是没有深刻理解递归的含义
- 自己的错误 2:根据列表创建二叉树需要前序+中序 或者 后序+中序,不然是没法创建的,debug还是老老实实手敲一下
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null) {
return false;
}
if (root.left == null && root.right == null) {
return sum == root.val;
}
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/path-sum/solutions/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
// 错错错错错错错错错错错错错错错错
private int targetSUM;
private int nowSUM;
public boolean hasPathSum(TreeNode root, int targetSum) {
targetSUM = targetSum;
if (root == null || root.val > targetSum) {
return false;
}
traverse(root);
return nowSUM == targetSum ? true : false;
}
void traverse(TreeNode node) {
if (node == null) {
return;
}
nowSUM = nowSUM + node.val;
if (nowSUM > targetSUM) {
nowSUM = nowSUM - node.val;
return;
}
if (nowSUM == targetSUM) {
return;
}
traverse(node.left);
if (nowSUM == targetSUM) {
return;
}
traverse(node.right);
if (nowSUM == targetSUM) {
return;
}
nowSUM = nowSUM - node.val;
}
leetcode106.从中序与后序遍历序列构造二叉树
注意:×
- 第一次写直接放弃,学习Labuladong书里面的内容
- 错误1:没有捋顺下标的操作
- 错误2:注意
leftSize
的使用 - 错误3:注意build前端判断inStart>inEnd的操作,不然会报错indexException -1
private HashMap<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] inorder, int[] postorder) {
// 1.根据中序的内容生成<内容,下标>
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
// 2.使用build函数进行递归操作
TreeNode root = build(inorder, 0, inorder.length-1,
postorder, 0, postorder.length-1);
return root;
}
private TreeNode build(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) {
// 这里也忘了
if(inStart > inEnd){
return null;
}
int rootVal = postorder[postEnd];
int index = map.get(rootVal);
TreeNode root = new TreeNode(rootVal);
// 这里老是忘记
int leftSize = index-inStart;
root.left = build(inorder, inStart, index-1,
postorder, postStart, postStart+leftSize-1);
root.right = build(inorder, index+1, inEnd,
postorder, postStart+leftSize, postEnd-1);
return root;
}