️ 力扣原文
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
输入:root = [1,null,2,3]
输出:[1,3,2]
输入:root = []
输出:[]```
```bash
输入:root = [1]
输出:[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> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
inorder(root, res);
return res;
}
private void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
}
栈实现:
使用栈来实现中序遍历需要注意每个节点的访问顺序。当遍历到一个节点时,先将其入栈,再将其左子树的所有节点入栈,直到遇到叶子节点。然后出栈一个节点并访问,然后将其右子树入栈,再将右子树的所有左子树入栈。直到栈为空为止。
/**
* 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> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
return res;
}
}