一 LC94.二叉树的中序遍历
题目要求:
给定一个二叉树的根节点
root
,返回 它的 中序 遍历 。
思路分析:
中序遍历的顺序是:左子树 -> 根节点 -> 右子树。通过递归的方式,我们可以按照以下步骤遍历二叉树:
如果当前节点的左子树不为空,那么先递归遍历左子树。在遍历完左子树后,访问当前节点(根节点),最后递归访问当前节点的右子树。
完整代码示例:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>(); // 用于存储遍历结果的列表
inorderHelper(root, result); // 调用辅助函数进行递归遍历
return result; // 返回遍历结果
}
// 中序遍历的递归辅助函数
private void inorderHelper(TreeNode node, List<Integer> result) {
// 递归终止条件:如果当前节点为空,直接返回
if (node == null) {
return;
}
// 递归遍历左子树
inorderHelper(node.left, result);
// 访问根节点:将当前节点的值加入到结果列表中
result.add(node.val);
// 递归遍历右子树
inorderHelper(node.right, result);
}
}
二 LC104.二叉树的最大深度
题目要求:
给定一个二叉树
root
,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
思路分析:
最大深度是指从根节点到最远叶子节点的最长路径上的节点数。这个问题可以通过递归的方法求解。对于每一个节点,最大深度等于其左子树的最大深度和右子树的最大深度中的较大者,再加 1(加上当前节点自身),如果当前节点为空,说明已经到达叶子节点的子节点,此时返回深度为 0。
具体而言,对于每一个节点,我们需要递归计算它的左子树和右子树的深度,如果该节点为空(即递归到了叶子节点的子节点),我们返回 0,如果不为空,则通过递归调用左子树和右子树的最大深度,取较大值,并加 1(表示包含当前节点的深度)。
完整代码示例:
class Solution {
public int maxDepth(TreeNode root) {
// 递归终止条件:如果当前节点为空,返回深度为 0
if (root == null) {
return 0;
}
// 递归计算左子树的深度
int leftDepth = maxDepth(root.left);
// 递归计算右子树的深度
int rightDepth = maxDepth(root.right);
// 当前节点的深度为左右子树深度的较大值加 1
return Math.max(leftDepth, rightDepth) + 1;
}
}
三 LC226.翻转二叉树
题目要求:
给你一棵二叉树的根节点
root
,翻转这棵二叉树,并返回其根节点。
思路分析:
翻转二叉树的意思是将每个节点的左右子树进行交换,即将左子树变为右子树,右子树变为左子树。这个问题可以通过递归来实现,逐步对每一个节点的左右子树进行交换,当节点为 null
时,表示已经到达叶子节点的子节点,不再需要翻转,返回该节点,否则递归调用左右子树的反转,并将结果分别存储在 left
和 right
变量中,将递归翻转后的左子树赋值给当前节点的右子树,将翻转后的右子树赋值给当前节点的左子树,从而完成翻转,返回当前节点作为新的根节点,确保递归逐层返回时,整个二叉树都被翻转。。
完整代码示例:
class Solution {
public TreeNode invertTree(TreeNode root) {
// 递归终止条件:如果当前节点为空,直接返回
if (root == null) {
return null;
}
// 递归翻转左子树和右子树
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
// 交换当前节点的左子树和右子树
root.left = right;
root.right = left;
// 返回当前节点,作为翻转后的根节点
return root;
}
}