仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
116.填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。二叉树定义:
图例:
提供参数:根结点root
主要思路:与二叉树的层序遍历大体相同,在每层的操作时,需要使用一个指针将第一个节点的操作提出来,然后在后续的循环遍历时,指针的循环一起移动。
二叉树的层序遍历在上一次学习中学习过了不再赘述。
代码 大致如下:
public Node connect(Node root) {//Queue<Node>queue=new LinkedList<Node>();if(root==null)return root;queue.offer(root);while(!queue.isEmpty()){int len=queue.size();Node node=queue.poll();if(node.left!=null) queue.offer(node.left);if(node.right!=null) queue.offer(node.right);for(int i=1;i<len;i++){Node temp=queue.poll();if(temp.left!=null)queue.offer(temp.left);if(temp.right!=null)queue.offer(temp.right);node.next=temp;node=temp;}}return root;}
117.填充每个节点的下一个右侧节点指针II
题目与116.填充每个节点的下一个右侧节点指针类似,不过不是116中的完全二叉树,而是普通二叉树。
提供参数:根结点root
主要思路:和116的思路完全一致,二叉树完不完全在我们的思路下完全不影响。
代码和上一题一样:
public Node connect(Node root) {//Queue<Node>queue=new LinkedList<Node>();if(root==null)return root;queue.offer(root);while(!queue.isEmpty()){int len=queue.size();Node node=queue.poll();if(node.left!=null) queue.offer(node.left);if(node.right!=null) queue.offer(node.right);for(int i=1;i<len;i++){Node temp=queue.poll();if(temp.left!=null)queue.offer(temp.left);if(temp.right!=null)queue.offer(temp.right);node.next=temp;node=temp;}}return root;}
104.二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。例如如下子树深度为3:
主要思路:与二叉树的层序遍历大体相同,一个树的最大深度就是层数,使用整型变量dep记录层数,在每层的操作后dep++,最后返回dep即可。
代码大致如下:
public int maxDepth(TreeNode root) {int dep=0;Queue<TreeNode>queue=new LinkedList<TreeNode>();if(root==null)return dep;queue.offer(root);while(!queue.isEmpty()){int len=queue.size();for(int i=0;i<len;i++){TreeNode temp=queue.poll();if(temp.left!=null)queue.offer(temp.left);if(temp.right!=null)queue.offer(temp.right);}dep++;}return dep;}
111.二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。如下图最小深度为2:
主要思路:和104.二叉树的最大深度相比只需要做一些小改动,二叉树在每层当遇到左右子结点都为null时就可以确定到达最小深度了,所以在每层的循环遍历操作中需要加入对是否到达最小深度的判断,在上一题中,我们把dep++放在每层操作结束后,这里由于在每层操作中可能会在操作中间就到达最小深度,所以我们需要将dep++提前,提前到在对每层操作开始前,可以这么做的原因是:如果没有下一层的操作(上一层的操作中间遇到了最小深度),就已经返回了,能dep++显然说明该层是存在的。
代码大致如下:
public int minDepth(TreeNode root) {int dep=0;Queue<TreeNode>queue=new LinkedList<TreeNode>();if(root==null)return dep;queue.offer(root);while(!queue.isEmpty()){int len=queue.size();dep++;for(int i=0;i<len;i++){TreeNode temp=queue.poll();if(temp.left!=null)queue.offer(temp.left);if(temp.right!=null)queue.offer(temp.right);if(temp.left==null&&temp.right==null) return dep;}}return dep; }