JAVA练习304- 二叉树的中序遍历

📅 2026/7/18 14:47:05 👁️ 阅读次数 📝 编程学习
JAVA练习304- 二叉树的中序遍历

题目概览

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

进阶:递归算法很简单,你可以通过迭代算法完成吗?

来源:94. 二叉树的中序遍历 - 力扣(LeetCode)

解题分析

方法一:递归

左 - 根 - 右 顺序递归即可。

时间复杂度:O(n)
空间复杂度:O(n)

/** * 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> result = new ArrayList<>(); if (root == null) { return result; } List<Integer> left = inorderTraversal(root.left); result.addAll(left); result.add(root.val); List<Integer> right = inorderTraversal(root.right); result.addAll(right); return result; } }

方法二:迭代 + 栈

根据栈先进后出的特性,可以现将二叉树的所有左节点都入栈,栈顶的节点一定是第一个节点,出栈并记录该节点值,将该节点右节点继续刚才左节点入栈的操作,没有则继续出栈,直到栈为空。

时间复杂度:O(n)
空间复杂度:O(n)

/** * 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> result = new ArrayList<>(); if (root == null) { return result; } Deque<TreeNode> stack = new LinkedList<>(); while(root != null || !stack.isEmpty()) { while(root != null) { stack.push(root); root = root.left; } TreeNode node = stack.pop(); result.add(node.val); root = node.right; } return result; } }