Java中的二叉树遍历函数是什么?
Java中的二叉树遍历函数有三种,分别是前序遍历、中序遍历和后序遍历。这三种遍历方式是二叉树最基本的遍历方式,它们分别都有自己的递归实现方式和非递归实现方式。
1. 前序遍历
前序遍历的顺序是先访问根节点,再访问左子树,最后访问右子树。具体实现步骤如下:
① 如果根节点不为空,则打印根节点的值。
② 如果左子树不为空,则递归遍历左子树。
③ 如果右子树不为空,则递归遍历右子树。
Java代码实现:
// 递归实现
public void preorderTraversal(TreeNode root) {
if (root != null) {
System.out.print(root.val + " ");
preorderTraversal(root.left);
preorderTraversal(root.right);
}
}
// 非递归实现
public void preorderTraversal(TreeNode root) {
if (root == null) {
return;
}
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);
}
}
}
2. 中序遍历
中序遍历的顺序是先访问左子树,再访问根节点,最后访问右子树。具体实现步骤如下:
① 如果左子树不为空,则递归遍历左子树。
② 如果根节点不为空,则打印根节点的值。
③ 如果右子树不为空,则递归遍历右子树。
Java代码实现:
// 递归实现
public void inorderTraversal(TreeNode root) {
if (root != null) {
inorderTraversal(root.left);
System.out.print(root.val + " ");
inorderTraversal(root.right);
}
}
// 非递归实现
public void inorderTraversal(TreeNode root) {
if (root == null) {
return;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.left;
}
node = stack.pop();
System.out.print(node.val + " ");
node = node.right;
}
}
3. 后序遍历
后序遍历的顺序是先访问左子树,再访问右子树,最后访问根节点。具体实现步骤如下:
① 如果左子树不为空,则递归遍历左子树。
② 如果右子树不为空,则递归遍历右子树。
③ 如果根节点不为空,则打印根节点的值。
Java代码实现:
// 递归实现
public void postorderTraversal(TreeNode root) {
if (root != null) {
postorderTraversal(root.left);
postorderTraversal(root.right);
System.out.print(root.val + " ");
}
}
// 非递归实现
public void postorderTraversal(TreeNode root) {
if (root == null) {
return;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.peek();
if ((node.left == null && node.right == null) || (pre != null && (pre == node.left || pre == node.right))) {
System.out.print(node.val + " ");
pre = node;
stack.pop();
} else {
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
}
}
总结:
以上就是Java中的三种二叉树遍历方式,它们都有递归和非递归两种实现方式。对于一般的二叉树问题,递归实现方式较为简单直观,非递归实现方式则需要注意一些细节问题,例如在后序遍历中需要考虑节点的访问顺序等问题。在使用Java进行二叉树遍历时,可以根据具体问题场景选择合适的遍历方式和实现方式。
