给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
中序遍历是一种遍历二叉树的方式,其顺序是:首先遍历左子树,然后访问根节点,最后遍历右子树。在 Java 中,可以通过递归和非递归两种方式来实现二叉树的中序遍历。下面我将提供这两种方法的实现。
###方法1:递归实现
使用递归进行中序遍历是最自然的方式。下面是一个递归实现的示例:
import java.util.ArrayList;
import java.util.List;
// 定义二叉树节点类
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class InorderTraversal {
// 中序遍历的主函数
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) {
inorderHelper(node.left, result); // 遍历左子树
result.add(node.val); // 访问节点
inorderHelper(node.right, result); // 遍历右子树
}
}
public static void main(String[] args) {
// 构建一个示例二叉树
TreeNode root = new TreeNode(1);
root.right = new TreeNode(2);
root.right.left = new TreeNode(3);
InorderTraversal traversal = new InorderTraversal();
List<Integer> result = traversal.inorderTraversal(root);
System.out.println(result); // 输出: [1, 3, 2]
}
}
### 方法2:非递归实现
我们可以使用栈(Stack)来实现二叉树的非递归中序遍历。代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
// 定义二叉树节点类
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class InorderTraversal {
// 中序遍历的主函数
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode current = root;
while (current != null || !stack.isEmpty()) {
// 将所有左节点推入栈
while (current != null) {
stack.push(current);
current = current.left;
}
// 栈顶元素是当前节点,访问它
current = stack.pop();
result.add(current.val);
// 转向右子树
current = current.right;
}
return result;
}
public static void main(String[] args) {
// 构建一个示例二叉树
TreeNode root = new TreeNode(1);
root.right = new TreeNode(2);
root.right.left = new TreeNode(3);
InorderTraversal traversal = new InorderTraversal();
List<Integer> result = traversal.inorderTraversal(root);
System.out.println(result); // 输出: [1, 3, 2]
}
}
### 说明:
- **TreeNode 类:** 用于定义二叉树的节点,每个节点包含一个整数值、一个指向左子树的指针和一个指向右子树的指针。
- **inorderTraversal 方法:** 这是一个公共方法,返回中序遍历的结果。根据使用的实现方式,它会调用相应的辅助或者非递归方法。
- **主函数(main 方法):** 在主函数中,我们创建了一个示例二叉树并调用 `inorderTraversal` 方法以演示结果。