题目描述
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
提示:
- 二叉树的节点个数的范围是 [0,100]
- -100 <= Node.val <= 100
代码及注释
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func rightSideView(root *TreeNode) []int {
// 初始化结果集和临时数组
var res, ans []int
// 初始化栈,用于迭代遍历二叉树
var stack []*TreeNode
// 如果根节点为空,直接返回空的结果集
if root == nil {
return res
}
// 将根节点入栈
stack = append(stack, root)
// 迭代遍历二叉树
for len(stack) > 0 {
// 获取当前栈的长度
length := len(stack)
// 遍历当前栈中的所有节点
for i := 0; i < length; i++ {
root = stack[i]
// 将当前节点的值添加到临时数组
ans = append(ans, root.Val)
// 如果当前节点有左子节点,将左子节点入栈
if root.Left != nil {
stack = append(stack, root.Left)
}
// 如果当前节点有右子节点,将右子节点入栈
if root.Right != nil {
stack = append(stack, root.Right)
}
}
// 更新栈,去除已遍历的节点
stack = stack[length:]
// 将临时数组的最后一个元素(即每层的最右边元素)添加到结果集中
res = append(res, ans[len(ans) - 1])
// 重置临时数组
ans = []int{}
}
// 返回结果集
return res
}
代码解释
- 使用层次遍历来遍历二叉树。
- 使用一个栈来迭代遍历二叉树。
- 每遍历完一层,将该层最右边的节点的值添加到结果集中。