学习目标:
每天复习代码随想录上的题目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一个新的ListList<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);//bfswhile(!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;}
}