博客
关于我
力扣 - 102. 二叉树的层序遍历
阅读量:450 次
发布时间:2019-03-06

本文共 1754 字,大约阅读时间需要 5 分钟。

目录

题目

思路一(迭代)

采用广度优先搜索(BFS)的方法,利用队列的先进先出特性遍历树节点。

  • BFS广度优先搜索
  • 使用队列来实现先进先出的特性

代码

import java.util.*;  public class Solution {      public List levelOrder(TreeNode root) {          List res = new LinkedList<>();          if (root == null) {              return res;          }          Deque queue = new LinkedList<>();          queue.offer(root);          while (!queue.isEmpty()) {              List level = new LinkedList<>();              int size = queue.size();              while (size > 0) {                  TreeNode node = queue.poll();                  level.add(node.val);                  if (node.left != null) {                      queue.offer(node.left);                  }                  if (node.right != null) {                      queue.offer(node.right);                  }                  size--;              }              res.add(level);          }          return res;      }  }

复杂度分析

该方法的时间复杂度为O(N),因为每个节点只会被访问一次。空间复杂度同样为O(N),因为在最坏情况下队列会保存所有节点。

思路二(递归)

采用深度优先搜索(DFS)的方法,递归地遍历树节点,并将每一层的节点值按层存储。

  • DFS深度优先搜索
  • 递归函数中使用索引来表示当前处理的层数
  • 每次递归调用时,将当前节点值添加到对应的层中

代码

import java.util.*;  public class Solution {      public List levelOrder(TreeNode root) {          List res = new LinkedList<>();          if (root == null) {              return res;          }          dfs(1, res, root);          return res;      }      private void dfs(int index, List res, TreeNode root) {          if (root == null) {              return;          }          if (res.size() < index) {              res.add(new LinkedList<>());          }          res.get(index - 1).add(root.val);          dfs(index + 1, res, root.left);          dfs(index + 1, res, root.right);      }  }

复杂度分析

该方法的时间复杂度也是O(N),因为每个节点都会被访问一次。空间复杂度为O(h),其中h为树的高度,这是因为递归过程中每一层都需要存储当前层的节点值。

转载地址:http://lspyz.baihongyu.com/

你可能感兴趣的文章
Python 多处理如何优雅地退出?
查看>>
Python 多处理将子进程的标准输出重定向到 Tkinter 文本
查看>>
Python 多处理库错误(AttributeError:__exit__)
查看>>
Python 多处理模块的 .join() 方法到底在做什么?
查看>>
python 多线程与GIL
查看>>
Python 多线程学习(转)
查看>>
python 多进程-基础
查看>>
python 多进程-进阶-进程池
查看>>
python 多进程-进阶-进程间通信之Pipe
查看>>
python 多进程-进阶-进程间通信之Queue
查看>>
Python编程快速入门
查看>>
Python编程基础(附Pycharm与开发环境)
查看>>
python 如何“否定“value : 如果为真则返回假,如果为假则返回真
查看>>
Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化
查看>>
python 如何把字符串转换成浮点数
查看>>
python 如果文件夹不存在就创建文件夹
查看>>
Python 如果有很多或以收缩形式
查看>>
Python 子进程 Popen 与 Pyinstaller
查看>>
Python 子进程 Popen.communicate() 等价于 Popen.stdout.read()?
查看>>
Python 子进程 Popen:为什么会出现“ls *.txt“?不行?
查看>>