Java二叉树后序遍历:递归与迭代

二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

如下便是一棵二叉树:

二叉树的后序遍历方式为:

1. 如果根节点有左子树,遍历左子树

2. 如果根节点有右子树,遍历右子树

3. 遍历根节点

注意,上述步骤1、2同样以1、2、3的顺序进行遍历。

后序遍历方式1:迭代

public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> order = new ArrayList<Integer>();
        LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
        // 指向上一个被访问的节点
        TreeNode pre = null;
        while(root!=null || !stack.isEmpty()){
            // 遍历到左下
            while(root!=null){
                stack.push(root);
                root = root.left;
            }

 
### Java 实现二叉树层序遍历 以下是基于队列的二叉树层序遍历(广度优先搜索)的完整实现方法: #### 使用队列实现层序遍历的核心逻辑 为了完成二叉树的层序遍历,通常会采用队列作为辅助数据结构。具体过程如下: - 初始化一个空列表 `ret` 来保存每一层的结果。 - 如果根节点为空,则直接返回空列表。 - 创建一个队列并将根节点加入其中。 - 当队列不为空时,依次处理每层的所有节点,并将其子节点按顺序加入队列。 下面是完整的代码示例: ```java import java.util.*; class TreeNode { int val; TreeNode left, right; TreeNode(int x) { val = x; } } public class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); // 存储最终结果 if (root == null) return result; // 若根节点为空,直接返回空集合 Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); // 将根节点入队 while (!queue.isEmpty()) { // 队列非空则继续循环 int size = queue.size(); List<Integer> currentLevel = new ArrayList<>(); for (int i = 0; i < size; i++) { // 处理当前层的所有节点 TreeNode node = queue.poll(); // 出队并获取节点 currentLevel.add(node.val); if (node.left != null) queue.offer(node.left); // 左子节点存在则入队 if (node.right != null) queue.offer(node.right); // 右子节点存在则入队 } result.add(currentLevel); // 添加当前层的结果到总结果集中 } return result; // 返回最终结果 } } ``` 上述代码实现了通过队列进行二叉树层序遍历的功能[^1]。它能够逐层访问二叉树中的所有节点,并按照从左至右的顺序将各层节点值存入二维列表中[^3]。 --- #### 关键点解析 1. **初始化队列** 初始状态下,将根节点压入队列。这是启动层序遍历的第一步。 2. **层次控制** 每次迭代前计算当前队列大小 `size`,这表示当前层有多少个节点待处理。通过这一机制可确保每次只处理一层的数据。 3. **子节点扩展** 对于每个节点,若其左右子节点均不为空,则需分别将它们加入队列以便后续处理[^4]。 --- ### 输出示例 假设输入一棵简单的完全二叉树: ``` 1 / \ 2 3 / \ \ 4 5 7 ``` 调用函数后的输出应为: ```plaintext [ [1], [2, 3], [4, 5, 7] ] ``` 此结果展示了二叉树的层序遍历效果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的Coder*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值