欢迎访问宙启技术站
智能推送

使用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实现二叉树的前序、中序和后序遍历的方法,分别使用了递归和迭代两种方式。可以根据实际需求选择适合的方法进行遍历。