leetcode-199

109 阅读1分钟

题目描述:具体描述见原题。简单来说就是返回二叉树每层最右侧节点。

解题思路:大体思路同leetcode-102。唯一不同之处是102需要记录每层所有节点,本题只需要记录每层最后一个节点,可以先记录每层所有节点,返回切片最后一个元素即可。具体过程见代码。

具体代码:

func levelOrder(root *TreeNode) []int {
   res := make([]int, 0)
   if root == nil {
      return res
   }
   temp, next, queue, current := make([]int, 0), 0, make([]*TreeNode, 0), 1 // 广度优先遍历当然要使用队列了。current代表当前层节点个数,next代表当前层下一层节点个数。temp为记录当前层节点的数组。
   queue = append(queue, root) // 初始化队列,将根节点入队
   for len(queue) != 0 {
      for current != 0 {
         node := queue[0]
         if node.Left != nil { // 队列是先进先出,所以先判断左子树
            queue = append(queue, node.Left)
            next++
         }
         if node.Right != nil {
            queue = append(queue, node.Right)
            next++
         }
         temp = append(temp, node.Val) // 当前节点值入数组
         queue = queue[1:] // 访问过的的节点出队列
         current--
      }
      res = append(res, temp[len(temp)-1]) // 返回结果取每层最后一个节点
      current = next // 当前层所有节点访问完毕后,初始化相关数据
      next = 0
      temp = make([]int, 0)
   }
   return res
}

补充说明:无。