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

Java函数实现树的遍历方法详解

发布时间:2023-06-22 11:37:58

树是一种常见的数据结构,其遍历是我们在开发中经常遇到的问题。Java中提供了多种遍历树的方法,包括前序遍历、中序遍历和后序遍历。在这篇文章中,我们将详细讲解这三种遍历方法的实现。

一、前序遍历

前序遍历也称为先根遍历,具体实现可以使用递归或栈来实现。以下是使用递归的实现方法。

public void preOrderTraversal(TreeNode node) {

    if(node==null) {

        return;

    }

    System.out.print(node.val + " ");

    preOrderTraversal(node.left);

    preOrderTraversal(node.right);

}

使用栈的实现方法如下。

public void preOrderTraversalWithStack(TreeNode node) {

    if(node==null) {

        return;

    }

    Stack<TreeNode> stack = new Stack<>();

    stack.push(node);

    while(!stack.isEmpty()) {

        TreeNode currentNode = stack.pop();

        System.out.print(currentNode.val + " ");

        if(currentNode.right!=null) {

            stack.push(currentNode.right);

        }

        if(currentNode.left!=null) {

            stack.push(currentNode.left);

        }

    }

}

以上两种方法的时间复杂度均为O(n),其中n为树的节点数。

二、中序遍历

中序遍历也称为中根遍历,具体实现可以使用递归或栈来实现。以下是使用递归的实现方法。

public void inOrderTraversal(TreeNode node) {

    if(node==null) {

        return;

    }

    inOrderTraversal(node.left);

    System.out.print(node.val + " ");

    inOrderTraversal(node.right);

}

使用栈的实现方法如下。

public void inOrderTraversalWithStack(TreeNode node) {

    if(node==null) {

        return;

    }

    Stack<TreeNode> stack = new Stack<>();

    TreeNode currentNode = node;

    while(!stack.isEmpty() || currentNode!=null) {

        if(currentNode!=null) {

            stack.push(currentNode);

            currentNode = currentNode.left;

        } else {

            currentNode = stack.pop();

            System.out.print(currentNode.val + " ");

            currentNode = currentNode.right;

        }

    }

}

以上两种方法的时间复杂度均为O(n),其中n为树的节点数。

三、后序遍历

后序遍历也称为后根遍历,具体实现可以使用递归或栈来实现。以下是使用递归的实现方法。

public void postOrderTraversal(TreeNode node) {    

    if(node==null) {

        return;

    }

    postOrderTraversal(node.left);

    postOrderTraversal(node.right);

    System.out.print(node.val + " ");

}

使用栈的实现方法如下。

public void postOrderTraversalWithStack(TreeNode node) {

    if(node==null) {

        return;

    }

    Stack<TreeNode> stack = new Stack<>();

    Stack<TreeNode> output = new Stack<>();

    stack.push(node);

    while(!stack.isEmpty()) {

        TreeNode currentNode = stack.pop();

        output.push(currentNode);

        if(currentNode.left!=null) {

            stack.push(currentNode.left);

        }

        if(currentNode.right!=null) {

            stack.push(currentNode.right);

        }

    }

    while(!output.isEmpty()) {

        System.out.print(output.pop().val + " ");

    }

}

以上两种方法的时间复杂度均为O(n),其中n为树的节点数。

总结

以上就是Java函数实现树的遍历方法的详细讲解。在开发中,我们可以根据需求选择递归或栈来实现各种遍历方法。同时,我们也可以根据时间和空间复杂度来选择合适的遍历方法,以达到优化性能的目的。