使用Java实现二叉树的前序、中序和后序遍历的方法?
发布时间:2023-07-02 01:22:35
在Java中,二叉树的前序、中序和后序遍历可以通过递归和迭代两种方式实现。
递归方式:
1. 创建一个二叉树节点类,包含数据域和左右子节点的引用。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int data) {
this.val = data;
}
}
2. 实现前序遍历方法:
public void preOrderTraversal(TreeNode root) {
if (root != null) {
System.out.print(root.val + " ");
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
}
3. 实现中序遍历方法:
public void inOrderTraversal(TreeNode root) {
if (root != null) {
inOrderTraversal(root.left);
System.out.print(root.val + " ");
inOrderTraversal(root.right);
}
}
4. 实现后序遍历方法:
public void postOrderTraversal(TreeNode root) {
if (root != null) {
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.val + " ");
}
}
5. 创建二叉树实例,并调用相应的遍历方法进行测试:
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
BinaryTree tree = new BinaryTree();
System.out.println("前序遍历:");
tree.preOrderTraversal(root); // 预期输出:1 2 4 5 3
System.out.println("
中序遍历:");
tree.inOrderTraversal(root); // 预期输出:4 2 5 1 3
System.out.println("
后序遍历:");
tree.postOrderTraversal(root); // 预期输出:4 5 2 3 1
}
迭代方式:
1. 使用栈来实现迭代,先将根节点入栈。
2. 循环直至栈为空:
a. 将栈顶节点出栈并输出。
b. 将栈顶节点的右子节点(如果存在)入栈。
c. 将栈顶节点的左子节点(如果存在)入栈。
import java.util.Stack;
public void preOrderTraversal(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.empty()) {
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);
}
}
}
3. 中序遍历和后序遍历的迭代方式稍有不同,可以使用一个"标记"节点作为中间节点,当遍历到该节点时,将其出栈并输出,然后继续出栈并输出其右子节点。
public void inOrderTraversal(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while (curr != null || !stack.empty()) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
System.out.print(curr.val + " ");
curr = curr.right;
}
}
public void postOrderTraversal(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
TreeNode prev = null;
while (!stack.empty()) {
TreeNode curr = stack.peek();
if (prev == null || prev.left == curr || prev.right == curr) {
if (curr.left != null) {
stack.push(curr.left);
} else if (curr.right != null) {
stack.push(curr.right);
}
} else if (curr.left == prev) {
if (curr.right != null) {
stack.push(curr.right);
}
} else {
System.out.print(curr.val + " ");
stack.pop();
}
prev = curr;
}
}
以上是使用Java实现二叉树的前序、中序和后序遍历的方法,分别使用了递归和迭代两种方式。可以根据实际需求选择适合的方法进行遍历。
