二叉树的递归遍历
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;}
}