Java如何实现递归?
在Java中,二叉树的后序遍历可以使用递归或迭代的方式进行实现。
递归实现
递归实现后序遍历的思路是先递归访问当前节点的左子树,再递归访问右子树,最后访问当前节点本身。
下面是一个递归实现的示例代码:
public void postOrderTraversal(TreeNode root) {
if (root != null) {
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.val + " ");
}}
在上述代码中,postOrderTraversal()方法是一个递归方法,它首先递归访问当前节点的左子树,然后递归访问右子树,最后访问当前节点本身。
迭代实现
迭代实现后序遍历的思路是使用栈来保存待访问的节点。首先将根节点入栈,然后循环执行以下操作:
从栈顶取出一个节点,如果该节点没有子节点或者其子节点已经被访问过,则访问该节点并将其从栈中弹出;
如果该节点有子节点且子节点尚未被访问过,则依次将其右子节点、左子节点入栈。
下面是一个迭代实现的示例代码:
public void postOrderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode lastVisited = null; // 记录上一个访问的节点
while (root != null || !stack.isEmpty()) {
// 将左子节点入栈
if (root != null) {
stack.push(root);
root = root.left;
}
else {
TreeNode peekNode = stack.peek();
// 如果该节点没有右子节点或者右子节点已经被访问过,则访问该节点并将其从栈中弹出
if (peekNode.right == null || peekNode.right == lastVisited) {
System.out.print(peekNode.val + " ");
lastVisited = stack.pop();
}
// 否则将右子节点入栈
else {
root = peekNode.right;
}
}
}
}
在上述代码中,postOrderTraversal()方法是一个迭代方法,它使用了一个栈来保存待访问的节点,并使用lastVisited变量来记录上一个访问的节点。在循环中,如果当前节点没有左子节点,则从栈顶取出一个节点并访问它;否则将左子节点入栈。如果当前节点没有右子节点或者右子节点已经被访问过,则访问该节点并将其从栈中弹出;否则将右子节点入栈。