102#二叉树的层序遍历(代码片段)

yuzhenzero yuzhenzero     2023-01-12     542

关键词:

题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   /   9  20
    /     15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

分析思路

常规思维法

我们理一遍题意:给定一棵二叉树,把这棵二叉树一层一层地访问一遍,并且存储在一个二维数组里面。

这里面的难点就是怎么做到每次取一层的元素。

我们考虑使用队列来存储每一层的元素。为什么使用队列呢?因为对同一层的节点,先访问,再把他们存储到一个数组里,存储的顺序要和访问的顺序一致,而队列的特点就是先进先出,和我们的要求一致,所以考虑使用队列来实现本题。

算法如下:

  1. 首先,我们创建一个队列,用来访问节点(不一定是同一层);创建一个列表,用来存储同一层的节点;创建一个二维列表,用来存储最终的答案。

  2. 然后,先对根节点做处理,把根节点加入队列,用列表存储,在二维列表里面加入刚才的列表,这样,第一层节点就存储好了。

  3. 到了第二层,我们再创建一个列表,用来存储第二层的节点,并获取一下队列的长度,这里队列的长度是多少,接下来就要进行几次循环,每次循环是访问并存储当前节点的左子节点和右子节点。
  4. 每次循环要做的工作是:弹出队列头部的一个节点,将这个节点的左子节点和右子节点加入队列,并且把左子节点和右子节点的值存进刚才的列表。
  5. 若干次循环完成后,队列里面就都是下一层的节点,列表已经存好了这一层的节点。
  6. 把列表加入二维列表。
  7. 重复第3~6步,直到队列为空。

源码

public List<List<Integer>> levelOrder (TreeNode root) 
    Queue<TreeNode> q = new LinkedList<>();
    List<List<Integer>> ans = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    if (root == null)
        return ans;
    ((LinkedList<TreeNode>) q).add(root);
    list.add(root.val);
    ans.add(list);
    while (q.size() > 0) 
        list = new ArrayList<Integer>();
        int s = q.size();
        for (int i = 0; i < s; i++) 
            TreeNode tn = q.remove();
            if (tn.left != null) ((LinkedList<TreeNode>) q).add(tn.left);
            if (tn.right != null) ((LinkedList<TreeNode>) q).add(tn.right);
            if (tn.left != null) list.add(tn.left.val);
            if (tn.right != null) list.add(tn.right.val);
        
        if (list.size() > 0) 
            ans.add(list);
        
    
    return ans;

注意,在第12行,一定要用一个整形数来存队列的大小,不能直接在循环条件里面使用i<q.size(),因为在循环体中,队列大小是会变的,所以有必要用一个数来“固定”住这一层的队列的长度。

递归法

在讨论区还看到一种用递归的方法实现的,感觉十分巧妙,暂时就不解读了,PO出来分享给大家。

// 递归法
public List<List<Integer>> levelOrder (TreeNode root) 
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    levelOrderHelper(ans,root,0);
    return ans;



private void levelOrderHelper (List<List<Integer>> ans, TreeNode root, int height) 
    if (root == null) return;
    if (height >= ans.size()) 
        ans.add(new ArrayList<Integer>());
    
    ans.get(height).add(root.val);
    levelOrderHelper(ans, root.left, height + 1);
    levelOrderHelper(ans, root.right, height + 1);


刷题-力扣-102.二叉树的层序遍历(代码片段)

102.二叉树的层序遍历题目链接来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。题目描述给你一个二叉树,请你返回其... 查看详情

102#二叉树的层序遍历(代码片段)

题目描述给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。例如:给定二叉树:[3,9,20,null,null,15,7],3/920/157返回其层次遍历结果:[[3],[9,20],[15,7]]分析思路常规思维法我们理一遍题意:给定一棵二... 查看详情

leetcodeno.102二叉树的层序遍历(代码片段)

题目描述给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],  3  /\\ 9 20   / \\  15 7返回其层序遍历结果:[ [3], [... 查看详情

leetcode刷题100天—102.二叉树的层序遍历(二叉树)—day09(代码片段)

...#xff1a;作者:神的孩子在歌唱大家好,我叫运智102.二叉树的层序遍历难度中等987收藏分享切换为英文接收动态反馈给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点&#x... 查看详情

102.二叉树的层序遍历

102.二叉树的层序遍历给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:本文来自博客园,作者:Bail... 查看详情

leetcode-102-二叉树的层序遍历

二叉树的层序遍历题目描述:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。示例说明请见LeetCode官网。来源:力扣(LeetCode)链接:https://leetcode-cn.com/probl...著作权归领扣网络所... 查看详情

leetcode刷题python102.二叉树的层序遍历(代码片段)

1题目给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出: 查看详情

102.二叉树的层序遍历(队列+bfs+结构体)(代码片段)

题目描述leetcode-102:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/解题关键队列BFS结构体碎碎念这道题可以不用结构体,在while循环里面加一个for循环来遍历某一层的节点。但是很多宽搜的题一般节点需要存储一些别的信息... 查看详情

#yyds干货盘点#leetcode-102.二叉树的层序遍历

...出特性,将要遍历的节点放到队列里,实现层序遍历102.二叉树的层序遍历给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示... 查看详情

leetcode二叉树的层序遍历(代码片段)

二叉树的层序遍历题目描述题目分析二叉树的层序遍历代码实现总结题目描述题目分析xxxx这道题,题目是“二叉树的层序遍历”,首先我们提取一下题目和题目内容的关键词。“二叉树”、“层序遍历”、“每一层值分... 查看详情

leetcode二叉树的层序遍历(代码片段)

二叉树的层序遍历题目描述题目分析二叉树的层序遍历代码实现总结题目描述题目分析xxxx这道题,题目是“二叉树的层序遍历”,首先我们提取一下题目和题目内容的关键词。“二叉树”、“层序遍历”、“每一层值分... 查看详情

[javascript刷题]搜索-二叉树的层序遍历,leetcode102

[JavaScript刷题]搜索-二叉树的层序遍历,leetcode102githubrepo地址:https://github.com/GoldenaArcher/js_leetcode,Github的目录大概会更新的更勤快一些。题目地址:102.BinaryTreeLevelOrderTraversal题目如下:Giventherootofabinar 查看详情

二叉树的层序遍历(代码片段)

107.二叉树的层序遍历II给定一个二叉树,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树[3,9,20,null,null,15,7],​3​ /\\920​/\\157返回其自底... 查看详情

nc15二叉树的层序遍历(代码片段)

题目描述二叉树的层序遍历解题思路运用二叉树的层序遍历和二叉树的深度计算的思想;代码展示/***structTreeNode* intval;* structTreeNode*left;* structTreeNode*right;*;*/classSolutionpublic:/****@paramrootTreeNode类*@returnint整型vector 查看详情

102.二叉树的层序遍历(代码片段)

题目描述:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。 返回其层次遍历结果:示例:二叉树:[3,9,20,null,null,15,7], 思想:访问过程中,只需要将同一层中的节点同时入... 查看详情

java二叉树的层序遍历(代码片段)

查看详情

leetcodejs实现二叉树(前中后层序)遍历(递归迭代法)(代码片段)

文章目录144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历102.二叉树的层序遍历107.二叉树的层序遍历II144.二叉树的前序遍历原题链接:144.二叉树的前序遍历递归法:/***Definitionforabinarytreenode.*functionTreeNode(val,left,right)*t... 查看详情

leetcode102.二叉树的层序遍历(代码片段)

给你一个二叉树,请你返回其按层序遍历得到的结点值。(即逐层地,从左到右访问所有结点)。示例: 输入:二叉树:[3,9,20,null,null,15,7] 输出:[     [3],     [9,20],     [15,7]... 查看详情