vlambda博客
学习文章列表

二叉树的广度优先遍历

二叉树的广度优先遍历

 //二叉树bfs广度搜索遍历demon(使用队列)
  void bfs(TreeNode node) {
      Deque<TreeNode> deque = new ArrayDeque();
      deque.add(node);
      while (deque != null) {
          //利用队列先进先出原则,依次添加左右节点给队列
          TreeNode treeNode = deque.poll();
          if (treeNode != null) {
              deque.add(treeNode.left);
          }
          if (treeNode != null) {
              deque.add(treeNode.right);
          }
      }
  }

二叉树中的广度优先与深度优先区别:



letcode Top102二叉树的层序遍历:

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

*/
public class Top102二叉树的层序遍历 {
  /**
    * 方式一:使用深度优先dfs进行遍历
    *         深度优先遍历特性,故加入辅助遍历,层级,将同层级的放入同数组
    */
   
    /**
    * 方式二:使用广度优先bfs遍历,广度优先罗列出来的是一维数组,故每次将一层的节点全部取出
    */
   public List<List<Integer>> levelOrder(TreeNode root) {
       List<List<Integer>> result = new ArrayList<>();
       if (null == root) {
           return result;
      }
       bfs(root,result);
       return result;
  }
 
   void bfs(TreeNode treeNode, List<List<Integer>> result) {
       Deque<TreeNode> deque = new ArrayDeque<>();
       deque.add(treeNode);
       while (!deque.isEmpty()) {
           int size = deque.size();
           List<Integer> list = new ArrayList<>();
           for (int i = 0; i <size ; i++) {
               TreeNode node = deque.poll();
               list.add(node.val);
               if (node.left != null) {
                   deque.add(node.left);
              }
               if (node.right != null) {
                   deque.add(node.right);
              }
          }
           result.add(list);

      }
  }


}

class TreeNode {
   int val;
   TreeNode left;
   TreeNode right;
   TreeNode() {}
   TreeNode(int val) { this.val = val; }
   TreeNode(int val, TreeNode left, TreeNode right) {
       this.val = val;
       this.left = left;
       this.right = right;
  }
}