📅  最后修改于: 2023-12-03 15:15:50.439000             🧑  作者: Mango
在二叉树中,有三种基本遍历方式:Inorder(中序遍历)、Preorder(前序遍历)和Postorder(后序遍历)。在Java中,我们可以使用递归或迭代的方式实现这些遍历方式。本文将介绍如何在Java中实现这三种遍历方式。
在Inorder遍历中,我们首先遍历左子树,然后遍历当前节点,最后遍历右子树。
public void inOrderTraversal(TreeNode root) {
if (root != null) {
inOrderTraversal(root.left);
System.out.print(root.val + " ");
inOrderTraversal(root.right);
}
}
这里我们将递归访问左子树,然后访问当前节点,并最后访问右子树。
public void inOrderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode current = root;
while (!stack.isEmpty() || current != null) {
while (current != null) {
stack.push(current);
current = current.left;
}
current = stack.pop();
System.out.print(current.val + " ");
current = current.right;
}
}
这里我们使用了一个栈来实现Inorder遍历。我们首先将左子树的所有节点都压入栈中,直到找到最左边的节点。然后我们把栈中最上面的节点出栈并打印出来。接着我们访问右子树。重复这个过程直到所有节点都遍历一遍。
在Preorder遍历中,我们首先访问当前节点,然后遍历左子树,最后遍历右子树。
public void preOrderTraversal(TreeNode root) {
if (root != null) {
System.out.print(root.val + " ");
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
}
这里我们首先访问当前节点,然后访问左子树并访问右子树。
public void preOrderTraversal(TreeNode root) {
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);
}
}
}
这里我们使用了一个栈来实现Preorder遍历。我们首先将根节点压入栈中。然后我们不断地从栈中弹出节点,并打印出来。我们按照从右到左的顺序把右节点压入栈中,然后按照从右到左的顺序把左节点压入栈中。
在Postorder遍历中,我们首先遍历左子树,然后遍历右子树,最后访问当前节点。
public void postOrderTraversal(TreeNode root) {
if (root != null) {
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.val + " ");
}
}
这里我们将递归访问左子树,然后递归访问右子树,并最后访问当前节点。
public void postOrderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode current = root;
TreeNode lastVisited = null;
while (!stack.isEmpty() || current != null) {
if (current != null) {
stack.push(current);
current = current.left;
} else {
TreeNode peekNode = stack.peek();
if (peekNode.right != null && lastVisited != peekNode.right) {
current = peekNode.right;
} else {
System.out.print(peekNode.val + " ");
lastVisited = stack.pop();
}
}
}
}
这里我们使用了一个栈来实现Postorder遍历。我们首先将根节点压入栈中。然后我们不断地从栈中弹出节点,并打印出来。如果弹出的节点的右节点为空或者已经被访问过,那么我们就可以打印出它的值了。否则,我们按照从右到左的顺序将右节点和左节点压入栈中。这里使用了一个lastVisited变量来记录上一次访问的节点,以确保我们不会重复访问同一个节点。
本文介绍了Java中的Inorder、Preorder和Postorder遍历的递归和迭代实现。如果您想了解更多关于二叉树的内容,可以参考我的其他文章。