• 二叉树的层序遍历


    题目描述:

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

    示例:二叉树:[3,9,20,null,null,15,7],

        3
    /
    9 20
    /
    15 7

    返回其层次遍历结果:

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

      

    解题思路:

    首先我们要知道层序遍历考查的其实就是广度优先遍历(BFS),聪明的朋友肯定还知道他的孪生兄弟深度优先遍历(DFS),篇幅较长这里就不过多介绍,感兴趣的朋友请自行了解。

    要想完成广度优先遍历,我们要借助队列(先进先出,后进后出)的概念。

    思想 :当队列中的队首出队的时候,要从二叉搜索树中找到它的两个孩子入队。队列出队为空的时候,就将二叉树遍历完成了。

    我们再归纳一下广度优先遍历的步骤:

    1、将根节点入队(入队的时候不做别的操作);

    2、队列非空,所以接下来就要出队,规则是:依次出队,只要出队的元素有孩子,左右孩子依次入队,如果没有孩子不做任何操作。

    另外,由于此题的返回数据格式是封装每层,所以这里可以定义一个count计录每层的数量

    用简便图解如下:

    //go 
    //* Definition for a binary tree node.
    type TreeNode struct {
     Val int
     Left *TreeNode
     Right *TreeNode
    }
    
    func levelOrder(root *TreeNode) [][]int {
     var res [][]int
     if root == nil {
      return res
     }
     queue := make([]*TreeNode,0)
     queue = append(queue, root) // 添加到队尾,等于add()
     for len(queue) != 0 {
      count := len(queue)
      var list []int
      for count > 0 {
       node := queue[0] //取出队首,等于poll()
       queue = queue[1:] //移出队首更新队列
       list = append(list, node.Val)
       if node.Left != nil {
        queue = append(queue, node.Left)
       }
       if node.Right != nil {
        queue = append(queue, node.Right)
       }
       count--
      }
      res = append(res, list)
     }
     return res
    }
    

      地址:https://mp.weixin.qq.com/s/Gb9bg04PMR4mwM2ZET8HnA

  • 相关阅读:
    我在D2讲演的视频,已经可以下载了~
    走出海量数据及访问量压力困境
    博客作者应该学习的15个国外博客
    如何将jsp动态网页转换成静态页面
    新一代网络模式Web 2.0火爆发展
    数据库设计中的14个关键技巧
    如何进行RSS推广
    运用RUP 4+1视图方法进行软件架构设计
    02java关键词变量类型
    03java运算符函数
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13488672.html
Copyright © 2020-2023  润新知