【LeetCodehot100】二叉树大合集 T94:二叉树的中序遍历 T104:二叉树的最大深度 T226:翻转二叉树 T101:对称二叉树

今天题目不算难,我们来个二叉树大集合

T94:二叉树的中序遍历

题目理解 :

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

核心思路(递归)

递归的本质:

当前节点的结果 = 左子树结果 + 当前节点 + 右子树结果

每次调用:

dfs(node)

其实是在做:

遍历"以 node 为根的整棵子树"

代码实现

java 复制代码
//创建结果集合
List<Integer> res=new ArrayList<>();

//调用递归函数
dfs(root,res);
//返回结果
return res;

//中序遍历
private void dfs(TreeNode node,List<Integer> res){
//中止条件:节点为空
  if(node==null){
     return ; 
  }
  //遍历左子树
  dfs(node.left,res);
  //中间
  res.add(node.val);
  //右
  dfs(node.right,res);
}

题目感悟

第一次接触树结构,有一些语法需要熟悉,比如:TreeNode

感觉着这就像基础数据,需要记牢,并没有考察太大的思维点。

流程:

创建List集合存放数据

定义中序遍历函数dfs------>终止条件,左遍历,访问中间节点,右遍历。

T104:二叉树的最大深度

题目要求:求二叉树的最大深度

核心思想

本题挺简单的,就只有一个小易错点

不要将返回的长度忘记+1,也就是忘了把根节点加上去。

代码实现

java 复制代码
class Solution {
    public int maxDepth(TreeNode root) {
        // 终止条件:空节点深度为0
        if (root == null) {
            return 0;
        }

        // 递归计算左子树深度
        int leftDepth = maxDepth(root.left);

        // 递归计算右子树深度
        int rightDepth = maxDepth(root.right);

        // 返回最大深度 + 当前节点
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

本题感悟

  1. 别忘了+1
  2. 查找树深度的语法为maxDepth();

T226:翻转二叉树

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

简单来说,就是将左子树与右子树进行位置互换

纠正一个概念

我第一下看到返回值是一串数字,下意识认为需要创建一个结果集合来存放结果。但其实只需要return root就行了。

rootroot = 一个数字(比如 4) ❌ 这个理解是不对的

root是节点对象里面包含三种元素

java 复制代码
root = {
    val: 4,
    left: (节点2),
    right: (节点7)
}

代码实现

java 复制代码
class Solution {
    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;
    }
}

本题感悟

  1. 递归思想:自己调用自己

T101:对称二叉树

题目要求:给你一个二叉树的根节点 root , 检查它是否轴对称。

核心思路

本题不是遍历一颗树

而是:

同时比较两颗镜像树

一句话核心:

左子树的左 == 右子树的右

左子树的右 == 右子树的左

代码实现

java 复制代码
class Solution {
    public boolean isSymmetric(TreeNode root) {
        // 空树一定对称
        if (root == null) return true;

        // 比较左右子树
        return isMirror(root.left, root.right);
    }

    private boolean isMirror(TreeNode left, TreeNode right) {
        // 情况1:都为空 → 对称
        if (left == null && right == null) {
            return true;
        }

        // 情况2:一个为空,一个不为空 → 不对称
        if (left == null || right == null) {
            return false;
        }

        // 情况3:值不相等 → 不对称
        if (left.val != right.val) {
            return false;
        }

        // 情况4:递归比较"镜像位置"
        return isMirror(left.left, right.right)
            && isMirror(left.right, right.left);
    }
}

本题感悟

  1. 比较的概念,是左子树的左 == 右子树的右 左子树的右 == 右子树的左
  2. 关于是否镜像对称的判断,分为5步:1.root是否为空 2.是否都为空3.是否一个是空一个不是空 4.左右值是否相等 5.继续递归比较
相关推荐
IT_陈寒1 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala1 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
Navigator_Z4 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
wo_jack5 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH5 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
量化分析码农6 小时前
【Python量化波动率实战 02】波动率会传染:EWMA 指数加权给近期行情更大话语权
后端
冻柠檬飞冰走茶6 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
雪落漂泊6 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
GISer_Jing7 小时前
如何学习Agent
后端·langchain