学习目标:
每天复习代码随想录上的题目1-2道算法(时间充足可以继续)
今日碎碎念:
1)今天开始是二叉树系列
2)出租屋里不知道干啥,看看书啊刷刷算法,打打游戏,学学技术啥的,不让自己太闲着才行。
3)天天都是吃外卖,不出门了都,后续等到9号回来之后继续开始整理八股(以复习为主)。
力扣刷题
算法
力扣515:515. 在每个树行中找最大值
class Solution {
//结果集
public List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
dfs(root,0);
return res;
}
//dfs方式
public void dfs(TreeNode node,Integer deep){
if(node == null) return;
//记录深度
deep++;
//开始将遍历到的层加入大结果集
if(res.size() < deep){
//解读该if代码块:如果走到下一层了,我们就需要new一个新的List
List<Integer> item = new ArrayList<>();
//将新一层的小结果集放入大结果集
res.add(item);
}
//开始dfs:通过deep找到对应层级的小结果集来存入遍历到的节点
res.get(deep-1).add(node.val);
dfs(node.left,deep);
dfs(node.right,deep);
}
}
力扣116:116. 填充每个节点的下一个右侧节点指针
1)解答思路:这道题需要我们特殊处理一下根节点,因为根节点是没有右边兄弟节点的
2)同理,每一层的最后一个节点也是一样没有右边兄弟节点的,想明白这两个点,然后再去bfs遍历
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right, Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public Node connect(Node root) {
Deque<Node> que = new LinkedList<>();
if(root != null) que.offer(root);
//bfs
while(!que.isEmpty()){
//记录当前大小
int size = que.size();
//除了根节点没有兄弟节点以外,其余的都有,因此先对根节点特殊处理
Node cur = que.poll();
if(cur.left!=null) que.offer(cur.left);
if(cur.right!=null) que.offer(cur.right);
//然后去处理所有的子节点
for(int i = 1;i<size;i++){
Node tmp = que.poll();
if(tmp.left!=null) que.offer(tmp.left);
if(tmp.right!=null) que.offer(tmp.right);
//记录上一个节点,然后指向右边
cur.next = tmp;
cur = tmp;
}
}
return root;
}
}
力扣104:104. 二叉树的最大深度
解答思路:
1)注意,这里并不需要对每个节点去找从该节点出发的最深,因为bfs的性质,只要队列中还有,还能往下,deep直接增加即可,如果是dfs,就会麻烦一点。
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0;
int deep = 0;
Deque<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int size = que.size();
deep++;
for(int i = 0;i < size;i++){
//拿出当前节点
TreeNode tmp = que.poll();
//找孩子
if(tmp.left!=null) que.offer(tmp.left);
if(tmp.right!=null) que.offer(tmp.right);
}
}
return deep;
}
}
力扣111:111. 二叉树的最小深度
解答思路:
1)这道题思路同上,bfs直接做,当,当前节点的左右孩子为空,就可以返回答案了,如果存在孩子,还能继续往下走。
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
int deep = 0;
Deque<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int size = que.size();
//bfs性质,队列没空就可以继续
deep++;
for(int i = 0;i<size;i++){
TreeNode tmp = que.poll();
//当左右孩子都为空的时候才可以返回答案
if(tmp.left==null && tmp.right==null) return deep;
if(tmp.left!=null) que.offer(tmp.left);
if(tmp.right!=null) que.offer(tmp.right);
}
}
return deep;
}
}