LeetCode-094-二叉树的中序遍历-中等-Java实现

这篇博客介绍了如何解决LeetCode上的094题——二叉树的中序遍历。提供了两种方法,分别是使用递归和迭代(包括借助栈和链表)来实现,详细解析了思路并给出了相应的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
给定一个二叉树,返回它的中序 遍历。

示例:
输入: [1,null,2,3]
   1
    \
     2
    /
   3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal

方法一

思路:
递归
代码如下:

List<Integer> res = new ArrayList<>();
	/**
	 * 二叉树的中序遍历
	 * @param root
	 * @return
	 */
	public List<Integer> inorderTraversal (TreeNode root) {
		if (root != null) {
			helper (root);
		}
		return res;
	}
	
	/**
	 * 辅助函数
	 * @param root
	 */
	public void helper (TreeNode root) {
		if (root.left != null) {
			helper (root.left);
		}
		res.add(root.val);
		if (root.right != null) {
			helper (root.right);
		}
	}

方法二

思路:
迭代
通过借助数据结构,通常选择栈。今天我发现这道题用链表也可以,而且用时可以超过100%的用户。前者只能超过一半。
具体原理我还不清楚,留个坑。
代码如下:
借助栈

/**
	 * 借助栈
	 * @param root
	 * @return
	 */
	List<Integer> res = new ArrayList<>();
	public List<Integer> inorderTraversal3 (TreeNode root) {
		Stack<TreeNode> stack = new Stack<>();
		
		while (root != null || !stack.isEmpty()) {
			// 每一个节点都要找到最左边的节点
			while (root != null) {
				stack.push(root);
				root = root.left;
			}
			// 路过的节点都压栈,取栈顶元素
			root = stack.pop();
			res.add(root.val);
			// 右子树
			root = root.right;

		}
		return res;
	}

借助链表:

/**
	 * 借助链表
	 * @param root
	 * @return
	 */
	public List<Integer> inorderTraversal2 (TreeNode root) {
		List<Integer> res = new LinkedList<>();
		LinkedList<TreeNode> stack = new LinkedList<>();
		TreeNode node = root;
		while (node != null || !stack.isEmpty()) {
			// 每一个节点都要找到最左边的节点
			while (node != null) {
				stack.push(node);
				node = node.left;
			}
			// 路过的节点都压栈,取栈顶元素
			node = stack.pop();
			result.add(node.val);
			// 右子树
			node = node.right;
		}
		return res;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值