二叉树之层序遍历

本文详细解析了二叉树层次遍历的实现方法,利用队列数据结构辅助,通过逐层访问并记录节点值,展示了从空树到非空树的完整过程。关键步骤包括判断空树、初始化队列、计数层节点、弹出并记录节点,以及递归下一层。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遍历规则:二叉树的层次遍历就是按照从上到下每行,然后每行中从左到右依次遍历,得到的二叉树的元素值。

思路:对于层次遍历,我们通常会使用队列来辅助:因为队列是一种先进先出的数据结构,我们依照它的性质,如果从左到右访问完一行节点,并在访问的时候依次把它们的子节点加入队列,那么它们的子节点也是从左到右的次序,且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点

具体做法:

  • step 1:首先判断二叉树是否为空,空树没有遍历结果。
  • step 2:建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。
  • step 3:每次进入一层,统计队列中元素的个数。因为每当访问完一层,下一层作为这一层的子节点,一定都加入队列,而再下一层还没有加入,因此此时队列中的元素个数就是这一层的元素个数。
  • step 4:每次遍历这一层这么多的节点数,将其依次从队列中弹出,然后加入这一行的一维数组中,如果它们有子节点,依次加入队列排队等待访问。
  • step 5:访问完这一层的元素后,将这个一维数组加入二维数组中,再访问下一层。

 代码:

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        ArrayList<ArrayList<Integer> > res = new ArrayList();
        if(root == null)
            //如果是空,则直接返回空数组
            return res; 
        //队列存储,进行层次遍历
        Queue<TreeNode> q = new ArrayDeque<TreeNode>(); 
        q.add(root);
        while(!q.isEmpty()){
            //记录二叉树的某一行
            ArrayList<Integer> row = new ArrayList();  
            int n = q.size();
            //因先进入的是根节点,故每层节点多少,队列大小就是多少
            for(int i = 0; i < n; i++){
                TreeNode cur = q.poll();
                row.add(cur.val);
                //若是左右孩子存在,则存入左右孩子作为下一个层次
                if(cur.left != null)
                    q.add(cur.left);
                if(cur.right != null)
                    q.add(cur.right);
            }
            //每一层加入输出
            res.add(row); 
        }
        return res;
    }
}

完全二叉树层序遍历是一种常见的树遍历方法,特别适用于完全二叉树层序遍历按照树的层次从上到下、从左到右依次访问每个节点。以下是层序遍历的实现步骤和代码示例: ### 实现步骤 1. **初始化**:使用一个队列来存储待访问的节点。首先将根节点加入队列。 2. **遍历**:当队列不为空时,执行以下操作: - 从队列中取出一个节点,访问该节点。 - 将该节点的左子节点(如果存在)加入队列。 - 将该节点的右子节点(如果存在)加入队列。 ### 代码示例 ```python from collections import deque class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def level_order_traversal(root): if not root: return [] result = [] queue = deque([root]) while queue: level_size = len(queue) current_level = [] for _ in range(level_size): node = queue.popleft() current_level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(current_level) return result # 示例用法 # 构建一个完全二叉树 # 1 # / \ # 2 3 # / \ / # 4 5 6 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) root.right.left = TreeNode(6) print(level_order_traversal(root)) ``` ### 输出 ``` [[1], [2, 3], [4, 5, 6]] ``` 这个代码示例展示了如何对一个完全二叉树进行层序遍历,并返回每一层的节点值列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值