Appearance
实现二叉树的前序、中序和后序遍历(递归和非递归方式)
实现二叉树的前序、中序和后序遍历可以通过递归和非递归两种方式来完成。以下是详细的代码示例和解释:
二叉树节点类
java
class TreeNode {
int val; // 节点的值
TreeNode left; // 左子节点
TreeNode right; // 右子节点
TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}递归方式
前序遍历(递归)
java
public static void preorderTraversalRecursive(TreeNode node) {
if (node == null) {
return;
}
System.out.print(node.val + " "); // 访问根节点
preorderTraversalRecursive(node.left); // 递归遍历左子树
preorderTraversalRecursive(node.right); // 递归遍历右子树
}中序遍历(递归)
java
public static void inorderTraversalRecursive(TreeNode node) {
if (node == null) {
return;
}
inorderTraversalRecursive(node.left); // 递归遍历左子树
System.out.print(node.val + " "); // 访问根节点
inorderTraversalRecursive(node.right); // 递归遍历右子树
}后序遍历(递归)
java
public static void postorderTraversalRecursive(TreeNode node) {
if (node == null) {
return;
}
postorderTraversalRecursive(node.left); // 递归遍历左子树
postorderTraversalRecursive(node.right); // 递归遍历右子树
System.out.print(node.val + " "); // 访问根节点
}非递归方式
前序遍历(非递归)
java
import java.util.Stack;
public static void preorderTraversalIterative(TreeNode root) {
if (root == null) {
return;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
System.out.print(node.val + " "); // 访问根节点
if (node.right != null) {
stack.push(node.right); // 先将右子节点入栈
}
if (node.left != null) {
stack.push(node.left); // 再将左子节点入栈
}
}
}中序遍历(非递归)
java
import java.util.Stack;
public static void inorderTraversalIterative(TreeNode root) {
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();
System.out.print(current.val + " "); // 访问根节点
current = current.right; // 转向右子节点
}
}后序遍历(非递归)
java
import java.util.Stack;
public static void postorderTraversalIterative(TreeNode root) {
if (root == null) {
return;
}
Stack<TreeNode> stack = new Stack<>();
Stack<TreeNode> output = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
output.push(node);
if (node.left != null) {
stack.push(node.left); // 将左子节点入栈
}
if (node.right != null) {
stack.push(node.right); // 将右子节点入栈
}
}
while (!output.isEmpty()) {
System.out.print(output.pop().val + " "); // 访问根节点
}
}详细解释
- 递归方式:
- 前序遍历:访问根节点,然后递归遍历左子树和右子树。
- 中序遍历:递归遍历左子树,访问根节点,然后递归遍历右子树。
- 后序遍历:递归遍历左子树和右子树,然后访问根节点。
- 非递归方式:
- 前序遍历:使用栈来模拟递归,先访问根节点,然后将右子节点和左子节点依次入栈。
- 中序遍历:使用栈来模拟递归,先将左子节点入栈,访问根节点后转向右子节点。
- 后序遍历:使用两个栈,一个用于遍历,一个用于存储访问顺序,最后输出访问顺序。
通过这些方法,我们可以实现二叉树的前序、中序和后序遍历,既可以使用递归方式,也可以使用非递归方式。
更新: 2024-08-30 22:30:03
原文: https://www.yuque.com/tulingzhouyu/db22bv/bv4la1g8zkn2np83