代码随想录 二叉树第一周

二叉树的递归遍历

144. 二叉树的前序遍历

144. 二叉树的前序遍历

简单

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[1,2]

示例 5:

输入:root = [1,null,2]
输出:[1,2]
/*** Definition for a binary tree node.* 二叉树节点的定义* public class TreeNode {*     int val; // 节点值*     TreeNode left; // 左子节点*     TreeNode right; // 右子节点*     TreeNode() {} // 构造函数*     TreeNode(int val) { this.val = val; } // 带值的构造函数*     TreeNode(int val, TreeNode left, TreeNode right) { // 带值和子节点的构造函数*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 前序遍历函数public List<Integer> preorderTraversal(TreeNode root) {// 创建一个列表用于存放遍历结果List<Integer> list = new ArrayList<>();// 调用递归函数进行前序遍历preorder(root, list);// 返回遍历结果列表return list;}// 递归函数,用于前序遍历public void preorder(TreeNode root, List<Integer> list) {// 如果当前节点为空,直接返回if (root == null) {return;}// 将当前节点值加入到结果列表中list.add(root.val);// 递归遍历左子树preorder(root.left, list);// 递归遍历右子树preorder(root.right, list);}
}

145.二叉树的后序遍历

145. 二叉树的后序遍历

简单

相关标签

相关企业

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>(); // 创建一个列表用于存储后序遍历的结果postorder(root,list); // 调用后序遍历方法return list; // 返回结果列表}public void postorder(TreeNode root,List<Integer> list){if(root == null){ // 如果节点为空,直接返回return;}postorder(root.left,list); // 递归遍历左子树postorder(root.right,list); // 递归遍历右子树list.add(root.val); // 将当前节点的值添加到结果列表中}
}

94.二叉树的中序遍历

94. 二叉树的中序遍历

简单

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 定义一个方法,用于返回二叉树的中序遍历结果public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>(); // 创建一个列表用于存储中序遍历的结果inorder(root,list); // 调用中序遍历方法return list; // 返回结果列表}// 定义一个方法,用于实现二叉树的中序遍历public void inorder(TreeNode root,List<Integer> list){if(root == null){ // 如果节点为空,直接返回return;}inorder(root.left,list); // 递归遍历左子树list.add(root.val); // 将当前节点的值添加到结果列表中inorder(root.right,list); // 递归遍历右子树}
}

二叉树的迭代遍历

144.二叉树的前序遍历

前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。

为什么要先加入 右孩子,再加入左孩子呢? 因为这样出栈的时候才是中左右的顺序。

动画如下:

二叉树前序遍历(迭代法)

144. 二叉树的前序遍历

简单

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[1,2]

示例 5:

输入:root = [1,null,2]
输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 前序遍历二叉树public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>(); // 创建一个列表用于存储遍历结果if(root == null){ // 如果根节点为空,直接返回空列表return list;}Deque<TreeNode> stack = new LinkedList<>(); // 创建一个栈用于存储节点stack.push(root); // 将根节点入栈while(!stack.isEmpty()){ // 当栈不为空时,继续遍历TreeNode node = stack.pop(); // 弹出栈顶元素list.add(node.val); // 将节点的值添加到结果列表中if(node.right != null){ // 如果右子节点不为空,将右子节点入栈stack.push(node.right);}if(node.left != null){ // 如果左子节点不为空,将左子节点入栈stack.push(node.left);}}return list; // 返回遍历结果列表}
}

145.二叉树的后序遍历

145. 二叉树的后序遍历

简单

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>(); // 创建一个列表用于存储遍历结果if(root == null){ // 如果根节点为空,直接返回空列表return list;}Deque<TreeNode> stack = new LinkedList<>(); // 创建一个栈用于存储节点stack.push(root); // 将根节点入栈while(!stack.isEmpty()){ // 当栈不为空时,继续遍历TreeNode node = stack.pop(); // 弹出栈顶元素list.add(node.val); // 将节点的值添加到结果列表中if(node.left != null){ // 如果左子节点不为空,将左子节点入栈stack.push(node.left);}if(node.right != null){ // 如果右子节点不为空,将右子节点入栈stack.push(node.right);}}Collections.reverse(list);return list; // 返回遍历结果列表}
}

94.二叉树的中序遍历

分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点。

那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了处理顺序和访问顺序是不一致的。

94. 二叉树的中序遍历

已解答

简单

相关标签

相关企业

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>(); // 创建一个列表用于存储遍历结果if(root == null){ // 如果根节点为空,直接返回空列表return list;}Deque<TreeNode> stack = new LinkedList<>(); // 创建一个栈用于存储节点TreeNode cur = root; // 初始化当前节点为根节点while(cur != null || !stack.isEmpty()){ // 当当前节点不为空或者栈不为空时,继续遍历if(cur != null){ // 如果当前节点不为空stack.push(cur); // 将当前节点入栈cur = cur.left; // 将当前节点更新为其左子节点}else{ // 如果当前节点为空cur = stack.pop(); // 弹出栈顶元素作为当前节点list.add(cur.val); // 将当前节点的值添加到结果列表中cur = cur.right; // 将当前节点更新为其右子节点}}return list; // 返回遍历结果列表}
}

那么在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。

 指针先指向根节点,先向左访问节点并存入栈中,为空时就从栈中取元素放入结果数组中,然后将指针指向该取出的元素,向右访问,为空时再从栈中取元素并将指针指向此元素,以此类推

结束的条件是,指针为空并且栈中没有元素

102.二叉树的层序遍历

102. 二叉树的层序遍历

中等

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000
/*** Definition for a binary tree node.* 二叉树节点的定义* public class TreeNode {*     int val; // 节点值*     TreeNode left; // 左子节点*     TreeNode right; // 右子节点*     TreeNode() {} // 构造函数*     TreeNode(int val) { this.val = val; } // 带值的构造函数*     TreeNode(int val, TreeNode left, TreeNode right) { // 带值和子节点的构造函数*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 层序遍历函数public List<List<Integer>> levelOrder(TreeNode root) {// 创建一个列表用于存放结果List<List<Integer>> result = new ArrayList<>();// 如果根节点为空,直接返回结果列表if (root == null) {return result;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();// 创建一个列表用于存放当前层的节点值List<Integer> list = new LinkedList<>();// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();// 将节点值加入到当前层的列表中list.add(node.val);// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}// 将当前层的节点值列表加入到结果列表中result.add(list);}// 返回结果列表return result;}
}

107.二叉树的层序遍历||

107. 二叉树的层序遍历 II

已解答

中等

相关标签

相关企业

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<List<Integer>> levelOrderBottom(TreeNode root) {// 创建一个列表用于存放结果List<List<Integer>> result = new ArrayList<>();// 如果根节点为空,直接返回结果列表if (root == null) {return result;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();// 创建一个列表用于存放当前层的节点值List<Integer> list = new LinkedList<>();// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();// 将节点值加入到当前层的列表中list.add(node.val);// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}// 将当前层的节点值列表加入到结果列表中result.add(list);}//将得到的结果集合反转Collections.reverse(result);// 返回结果列表return result;}
}

199.二叉树的右视图

199. 二叉树的右视图

已解答

中等

相关标签

相关企业

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100 

层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。

/*** Definition for a binary tree node.* 二叉树节点的定义* public class TreeNode {*     int val; // 节点值*     TreeNode left; // 左子节点*     TreeNode right; // 右子节点*     TreeNode() {} // 构造函数*     TreeNode(int val) { this.val = val; } // 带值的构造函数*     TreeNode(int val, TreeNode left, TreeNode right) { // 带值和子节点的构造函数*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 右视图函数public List<Integer> rightSideView(TreeNode root) {// 创建一个列表用于存放右视图结果List<Integer> result = new ArrayList<>();// 如果根节点为空,直接返回结果列表if (root == null) {return result;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();// 如果当前节点是当前层最后一个节点,则将其值加入到结果列表中(右视图)if (size == 0) {result.add(node.val);}// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}}// 返回右视图结果列表return result;}
}

637.二叉树的层平均值

637. 二叉树的层平均值

已解答

简单

相关标签

相关企业

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

示例 2:

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

提示:

  • 树中节点数量在 [1, 104] 范围内
  • -231 <= Node.val <= 231 - 1
/*** Definition for a binary tree node.* 二叉树节点的定义* public class TreeNode {*     int val; // 节点值*     TreeNode left; // 左子节点*     TreeNode right; // 右子节点*     TreeNode() {} // 构造函数*     TreeNode(int val) { this.val = val; } // 带值的构造函数*     TreeNode(int val, TreeNode left, TreeNode right) { // 带值和子节点的构造函数*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 求每层节点平均值函数public List<Double> averageOfLevels(TreeNode root) {// 创建一个列表用于存放结果List<Double> result = new ArrayList<>();// 如果根节点为空,直接返回结果列表if (root == null) {return result;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();int count = queue.size(); // 记录当前层节点数// 初始化当前层节点值总和Double sum = 0.0;// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();// 将节点值加入到当前层的总和中sum += node.val;// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}// 计算当前层的平均值并加入结果列表result.add(sum / count);}// 返回结果列表return result;}
}

429.N叉树的层序遍历

429. N 叉树的层序遍历

已解答

中等

相关标签

相关企业

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

  • 树的高度不会超过 1000
  • 树的节点总数在 [0, 10^4] 之间
/*
// 定义一个节点类
class Node {public int val; // 节点值public List<Node> children; // 子节点列表public Node() {} // 默认构造函数public Node(int _val) { // 带值的构造函数val = _val;}public Node(int _val, List<Node> _children) { // 带值和子节点列表的构造函数val = _val;children = _children;}
};
*/class Solution {// 层序遍历函数public List<List<Integer>> levelOrder(Node root) {// 创建一个列表用于存放结果List<List<Integer>> result = new ArrayList<>();// 如果根节点为空,直接返回结果列表if (root == null) {return result;}// 创建一个队列用于辅助层序遍历Queue<Node> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();// 创建一个列表用于存放当前层的节点值List<Integer> list = new ArrayList<>();// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点Node node = queue.poll();// 将节点值加入到当前层的列表中list.add(node.val);// 获取当前节点的子节点列表List<Node> children = node.children;// 如果子节点列表为空或者大小为0,继续下一次循环if (children == null || children.size() == 0) {continue;}// 将子节点依次加入队列(如果存在)for (Node child : children) {if (child != null) {queue.offer(child);}}}// 将当前层的节点值列表加入到结果列表中result.add(list);}// 返回结果列表return result;}
}

515.在每个树行中找最大值

515. 在每个树行中找最大值

中等

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

输入: root = [1,2,3]
输出: [1,3]

提示:

  • 二叉树的节点个数的范围是 [0,104]
  • -231 <= Node.val <= 231 - 1
/*** Definition for a binary tree node.* 二叉树节点的定义* public class TreeNode {*     int val; // 节点值*     TreeNode left; // 左子节点*     TreeNode right; // 右子节点*     TreeNode() {} // 构造函数*     TreeNode(int val) { this.val = val; } // 带值的构造函数*     TreeNode(int val, TreeNode left, TreeNode right) { // 带值和子节点的构造函数*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 最大值数组函数public List<Integer> largestValues(TreeNode root) {// 创建一个列表用于存放结果List<Integer> result = new ArrayList<>();// 如果根节点为空,直接返回结果列表if (root == null) {return result;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();int max = Integer.MIN_VALUE;// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();// 更新当前层的最大值max = Math.max(max, node.val);// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}// 将当前层的最大值加入结果列表result.add(max);}// 返回结果列表return result;}
}

116.填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针

已解答

中等

相关标签

相关企业

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例 2:

输入:root = []
输出:[]

提示:

  • 树中节点的数量在 [0, 212 - 1] 范围内
  • -1000 <= node.val <= 1000
/*
// 定义一个节点类
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) {// 如果根节点为空,直接返回根节点if (root == null) {return root;}// 创建一个队列用于辅助层序遍历Queue<Node> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();Node pre = null; // 上一个节点// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点Node node = queue.poll();// 如果上一个节点不为空,则将其指向当前节点if (pre != null) {pre.next = node;}// 更新上一个节点为当前节点pre = node;// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}// 重置上一个节点pre = null;}// 返回根节点return root;}
}

117.填充每个节点的下一个右侧节点指针||

117. 填充每个节点的下一个右侧节点指针 II

中等

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

输入:root = []
输出:[]

提示:

  • 树中的节点数在范围 [0, 6000] 内
  • -100 <= Node.val <= 100
/*
// 定义一个节点类
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) {// 如果根节点为空,直接返回根节点if (root == null) {return root;}// 创建一个队列用于辅助层序遍历Queue<Node> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();Node pre = null; // 上一个节点// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点Node node = queue.poll();// 如果上一个节点不为空,则将其指向当前节点if (pre != null) {pre.next = node;}// 更新上一个节点为当前节点pre = node;// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}// 遍历完一层后,将最后一个节点的next指针置为nullpre.next = null;// 重置上一个节点pre = null;}// 返回根节点return root;}
}

104.二叉树的最大深度

104. 二叉树的最大深度

简单

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

广度优先遍历

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int maxDepth(TreeNode root) {// 如果根节点为空,直接返回深度为0if (root == null) {return 0;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);int depth = 0;// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 记录当前层的节点数int size = queue.size();// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}depth++; // 深度加1}// 返回树的最大深度return depth;}
}

深度优先遍历

/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/class Solution {public int maxDepth(TreeNode root) {if (root == null) {return 0;}return helper(root);}public int helper(TreeNode root) {if (root == null) {return 0;}int left = helper(root.left);int right = helper(root.right);return Integer.max(left, right) + 1;}}class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}

111.二叉树的最小深度

111. 二叉树的最小深度

简单

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

提示:

  • 树中节点数的范围在 [0, 105] 内
  • -1000 <= Node.val <= 1000
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int minDepth(TreeNode root) {// 如果根节点为空,直接返回深度为0if (root == null) {return 0;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);int depth = 1;// 当队列不为空时,继续遍历while (!queue.isEmpty()) {// 记录当前层的节点数int size = queue.size();// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();//如果当前节点的左右孩子都为空,直接返回最小深度if (node.left == null && node.right == null){return depth;}// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}depth++; // 深度加1}// 返回树的深度return depth;}
}

226.反转二叉树

226. 翻转二叉树

简单

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100] 内
  • -100 <= Node.val <= 100

深度优先遍历

/*** 二叉树节点的定义。* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/class Solution {/*** 翻转二叉树。* @param root 要翻转的二叉树的根节点* @return 翻转后的二叉树的根节点*/public TreeNode invertTree(TreeNode root) {if(root == null){return null;}TreeNode temp = root.left;root.left = root.right;root.right = temp;invertTree(root.left);invertTree(root.right);return root;}
}

广度优先遍历 

/*** 二叉树节点的定义。* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/class Solution {/*** 翻转二叉树。* @param root 要翻转的二叉树的根节点* @return 翻转后的二叉树的根节点*/public TreeNode invertTree(TreeNode root) {// 如果根节点为空,直接返回if (root == null) {return root;}// 创建一个队列用于辅助层序遍历Queue<TreeNode> queue = new LinkedList<>();// 将根节点加入队列queue.offer(root);// 层序遍历二叉树并翻转每个节点的左右子树while (!queue.isEmpty()) {// 获取当前层的节点数int size = queue.size();// 遍历当前层的所有节点while (size-- > 0) {// 从队列中取出一个节点TreeNode node = queue.poll();// 翻转当前节点的左右子树TreeNode temp = node.left;node.left = node.right;node.right = temp;// 将当前节点的左子节点加入队列(如果存在)if (node.left != null) {queue.offer(node.left);}// 将当前节点的右子节点加入队列(如果存在)if (node.right != null) {queue.offer(node.right);}}}// 返回翻转后的二叉树的根节点return root;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496950.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux和Windows集群中部署HTCondor

目录 1、集群架构 2、HTCondor版本 3、Linux系统安装 3.1、HTCondor安装 3.2、中央管理节点配置 3.3、其他节点配置 4、Windwos系统安装 5、安全配置 6、参考 1、集群架构 操作系统IP地址1*Ubuntu22.04192.168.1.742Ubuntu22.04192.168.1.603Ubuntu22.04192.168.1.6…

matlab 方向向量约束的PCA快速粗配准

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 该方法由本人原创,目前尚未见有相关论文用到。具体原理看代码即可。 二、代码实现 clc;clear; %% ------…

数据结构:循环队列

一、队列的概念 操作受限的线性表&#xff0c;允许在队列的一端执行入队操作&#xff0c;另一端执行出队操作 先进先出(FIFO) 1.顺序队列 物理结构连续&#xff0c;依赖于数组实现 队列中有一个队头指针和队尾指针&#xff0c;队头指针保存每次要出队的元素&#xff0c;队…

图形判断类型

笔画数 笔画数这一考点。在国考、省考以及事业单位、三支一扶等各种公务员考试当中&#xff0c;都作为一个重要考点的存在。但很多同学仍然对于这部分知识点不清晰&#xff0c;比如不知道如何数奇点&#xff0c;数不清奇点&#xff0c;或无法快速识别这类题型&#xff0c;以致…

07 Qt自绘组件:图片预览小组件ImageViewer

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

干货!Python字符串填充、去除、分割与合并

1.center() 将字符串按照指定内容填充到指定长度&#xff0c;默认填充的内容是空格 str1 "今天天气好晴朗"print(str1.center(50)) # 使用空间将原字符串填充到50个长度&#xff0c;原内容居中print(str1.center(50, "*")) # 使用 * 将原字符串填…

Python入门学习:if语句与条件控制--and、or、in、not in详解与实践

Python入门学习&#xff1a;if语句与条件控制–and、or、in、not in详解与实践 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

【Algorithms 4】算法(第4版)学习笔记 12 - 番外篇:二叉查找树的几何应用(上篇)

文章目录 前言参考目录学习笔记0&#xff1a;概述1&#xff1a;一维范围搜索&#xff08;1d range search&#xff09;1.1&#xff1a;一维范围搜索实现1.2&#xff1a;一维范围计数&#xff1a;BST 实现1.3&#xff1a;一维范围查找&#xff1a;BST 实现2&#xff1a;线段交点…

git之多人协作

一.多⼈协作⼀ 目标&#xff1a;在同一个分支上完成多人协作 任务&#xff1a;在linux和windows两个用户下分别在远程仓库&#xff08;非master分支&#xff09;中添加“linux submit”和“windows submit” 现在我们在远程仓库dev分支下filetxt文件情况&#xff1a; 我们先…

ky10-server docker 离线安装包、离线安装

离线安装脚本 # ---------------离线安装docker------------------- rpm -Uvh --force --nodeps *.rpm# 修改docker拉取源为国内 rm -rf /etc/docker mkdir -p /etc/docker touch /etc/docker/daemon.json cat >/etc/docker/daemon.json<<EOF{"registry-mirro…

Groovy(第九节) Groovy 之单元测试

JUnit 利用 Java 对 Song 类进行单元测试 默认情况下 Groovy 编译的类属性是私有的,所以不能直接在 Java 中访问它们,必须像下面这样使用 setter: 编写这个测试用例余下的代码就是小菜一碟了。测试用例很好地演示了这样一点:用 Groovy 所做的一切都可以轻易地在 Java 程序…

sql基本语法+实验实践

sql语法 注释&#xff1a; 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…