LeetCode 第102题 二叉树的层次遍历

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

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

3   / \  9  20    /  \   15   7返回其层次遍历结果:

[  [3],  [9,20],  [15,7]]
 1 /*
 2   思路1 : 用两个链表分别代替两个层次,交替使用
 3    */
 4   public List<List<Integer>> levelOrder(TreeNode root) {
 5     List<List<Integer>> res = new ArrayList<>();
 6     if (root == null) {
 7       return res;
 8     }
 9     List<TreeNode> list1 = new LinkedList<>();
10     List<TreeNode> list2 = new LinkedList<>();
11     list1.add(root);
12     while (list1.size() != 0 || list2.size() != 0) {
13       List<TreeNode> notEmptyList = list1.size() == 0
14           ? list2
15           : list1;
16       List<TreeNode> emptyList = list1.size() == 0
17           ? list1
18           : list2;
19       List<Integer> resList = new LinkedList<>();
20       while (notEmptyList.size() != 0) {
21         TreeNode temp = notEmptyList.remove(0);
22         resList.add(temp.val);
23         if (temp.left != null) {
24           emptyList.add(temp.left);
25         }
26         if (temp.right != null) {
27           emptyList.add(temp.right);
28         }
29       }
30       res.add(resList);
31     }
32     return res;
33   }
 1 /*
 2   思路2 : 直接层次遍历
 3    */
 4   public List<List<Integer>> levelOrder_1(TreeNode root) {
 5     List<List<Integer>> res = new ArrayList<>();
 6     if (root == null) {
 7       return res;
 8     }
 9     LinkedList<TreeNode> list = new LinkedList<>();
10     list.add(root);
11     int currLevelNodes = 1;
12     while (list.size() != 0) {
13       LinkedList<Integer> resList = new LinkedList<>();
14       currLevelNodes = list.size();
15       for (int i = currLevelNodes; i > 0; --i) {
16         TreeNode removeNode = list.remove();
17         resList.add(removeNode.val);
18         if (removeNode.left != null) {
19           list.add(removeNode.left);
20         }
21         if (removeNode.right != null) {
22           list.add(removeNode.right);
23         }
24       }
25       res.add(resList);
26     }
27     return res;
28   }
 1 /*
 2   思路3 : 递归层次遍历
 3    */
 4   public List<List<Integer>> levelOrder_2(TreeNode root) {
 5     List<List<Integer>> res = new ArrayList<>();
 6     search(root, 0, res);
 7     return res;
 8   }
 9
10   private void search(TreeNode parent, int level, List<List<Integer>> res) {
11     if (parent == null) {
12       return;
13     }
14     if (res.size() <= level) {
15       res.add(new ArrayList<>());
16     }
17     res.get(level).add(parent.val);
18     search(parent.left, level + 1, res);
19     search(parent.right, level + 1, res);
20   }

原文地址:https://www.cnblogs.com/rainbow-/p/10360102.html

时间: 2024-11-08 01:19:23

LeetCode 第102题 二叉树的层次遍历的相关文章

LeetCode 第107题 二叉树的层次遍历II

给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[ [15,7], [9,20], [3]] 思路: 先递归层次遍历 然后将res倒置 1 class Solution107 { 2 3 List<List<Integer>> res = new ArrayList<>(); 4

lintcode 中等题:binary tree level order traversal ii 二叉树的层次遍历II

题目 二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 解题 和上一题的答案反过来 直接每次在list中第一个位置加入当前层结点 /** * Definition of TreeNode: * public class TreeNode { *

二叉树的层次遍历(BFS)

今日在LeetCode平台上刷到一道Medium难度的题,要求是二叉树的层次遍历.个人认为难度并不应该定在Medium, 应该是Easy比较合适,因为并没有复杂的算法逻辑,也没有corner cases class Solution { public List<List<Integer>> levelOrder(TreeNode root) { //using queue List<List<Integer>> res= new ArrayList<&

数据结构——链队列实现二叉树的层次遍历

在二叉树的遍历这篇博客中https://www.cnblogs.com/wkfvawl/p/9901462.html 对于二叉树的层次遍历我只是给出了基于C++ STL的代码,这里我使用数据结构的链表,构建一个链队列来实现.这也算是我第一次使用链队列来完成某个任务,链队列代码还是来自课本,因为之前使用C++ STL时,queue中的某些函数是有返回值的列如Q.front(),而有些却没有返回值像Q.push(p),Q.pop(),就连有没有参数也是不同的,在这里我没有改动课本上的代码来适应自己的

重建二叉树与二叉树的层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000).代表有t组測试数据.每组包含两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 演示样例输

二叉树的层次遍历(队列) and 二叉搜索树的后序遍历序列

(一)从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.[层次遍历] 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的操作,直至队列中所有的节点都被打印出来为止. //二叉树的层次遍历#include<iostream>#include<queue>using namespace std; typedef int ElemType;typedef st

二叉树的层次遍历 II

二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 标签 二叉树 队列 二叉树遍历 宽度优先搜索 1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int

二叉树的层次遍历和其深度

//二叉树的层次遍历和其深度#include <cstdio>#include <cstdlib>//define _OJ_#define maxsize 100typedef struct tree1{    char data;    struct tree1 *lchild;    struct tree1 *rchild;} tree1, *tree; typedef struct queue1{    tree data;    struct queue1 *next;}

二叉树的层次遍历和(叶子)节点

#include<stdio.h> #include<string.h> #include<stdlib.h> #define size 100 #define resize 10 typedef struct Bitnode{ //定义结点 char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; typedef struct { //定义队列 Bitree *base; int front; int r