import java.util.*;

public class BinaryTree<T> {
    private final BinaryNode<T> root;

    public BinaryTree(BinaryNode<T> root) {
        this.root = root;
    }

    public List<T> preOrder() {
        List<T> result = new ArrayList<>();
        preOrderTraversal(root, result);
        return result;
    }

    private void preOrderTraversal(BinaryNode<T> node, List<T> result) {
        if (node == null)
            return;
        result.add(node.getVal());
        preOrderTraversal(node.getLeft(), result);
        preOrderTraversal(node.getRight(), result);
    }

    public List<T> inOrder() {
        List<T> result = new ArrayList<>();
        inOrderTraversal(root, result);
        return result;
    }

    private void inOrderTraversal(BinaryNode<T> node, List<T> result) {
        if (node == null)
            return;
        inOrderTraversal(node.getLeft(), result);
        result.add(node.getVal());
        inOrderTraversal(node.getRight(), result);
    }

    public List<T> postOrder() {
        List<T> result = new ArrayList<>();
        postOrderTraversal(root, result);
        return result;
    }

    private void postOrderTraversal(BinaryNode<T> node, List<T> result) {
        if (node == null)
            return;
        postOrderTraversal(node.getLeft(), result);
        postOrderTraversal(node.getRight(), result);
        result.add(node.getVal());
    }

    public List<T> levelOrder() {
        List<T> result = new ArrayList<>();
        if (root == null)
            return result;
        
        Queue<BinaryNode<T>> queue = new LinkedList<>();
        queue.offer(root);
        
        while (!queue.isEmpty()) {
            BinaryNode<T> node = queue.poll();
            result.add(node.getVal());
            
            if (node.getLeft() != null)
                queue.offer(node.getLeft());
            if (node.getRight() != null)
                queue.offer(node.getRight());
        }
        
        return result;
    }

    public List<T> inOrderNonRecur() {
        List<T> result = new ArrayList<>();
        if (root == null)
            return result;
        
        Stack<BinaryNode<T>> stack = new Stack<>();
        BinaryNode<T> curr = root;
        
        while (curr != null || !stack.isEmpty()) {
            while (curr != null) {
                stack.push(curr);
                curr = curr.getLeft();
            }
            
            curr = stack.pop();
            result.add(curr.getVal());
            curr = curr.getRight();
        }
        
        return result;
    }
}

上述代码中,我们定义了BinaryTree类,它有一个泛型参数T,并接受一个BinaryNode类型的根节点作为构造函数的参数。类中包含了前序遍历、中序遍历、后序遍历、层序遍历和非递归中序遍历的方法。

在代码中,我们使用递归方式实现了前序遍历、中序遍历和后序遍历。而层序遍历则利用队列来进行广度优先搜索的方式实现。非递归中序遍历则利用栈来模拟递归的过程。

以上是对您提供的代码进行了补充和完善,使其实现了所需的二叉树遍历方法。

Java 二叉树遍历实现 - 前序、中序、后序、层序遍历

原文地址: https://www.cveoy.top/t/topic/Xmt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录