题目
26年5月13日(首刷思路正确,写法小错误借助ai提示修改,然后自解)
func rightSideView(root *TreeNode) []int {
ret:=[]int{}
if root==nil{
return nil
}
q:=[]*TreeNode{root}
for i:=0;len(q)>0;i++{
p:=[]*TreeNode{}
for j:=0;j<len(q);j++{
node:=q[j]
if node.Left!=nil{
p=append(p,node.Left)
}
if node.Right!=nil{
p=append(p,node.Right)
}
}
ret=append(ret,q[len(q)-1].Val)
q=p
}
return ret
}
一开始我的思路(复杂且可能错误) vs 后来我的正确思路
首先这题肯定是在102层序遍历的基础上微调
开始的思路(复杂可能错误) 一开始我想的是看了这两个带图示例我没有什么好办法,我想的是给每个节点加一个状态isBlock,如果例如在左右节点都存在的情况下,左节点被遮挡状态就写上false,然后在ret=append()这里计入结果数组时先判断遮不遮挡,
但是如果用这种方法我想简单了,如果是那种完全二叉树,那么祖先节点延伸下来的同一层右节点中靠左的右节点完全也可能被遮挡。那么情况就复杂多了
后来的思路
其实开始想复杂了,这里就只是把每一层最右边的节点记录到数组就可以了,只是树的遍历还需要每个节点的参与
可以看到把ret=append(ret,q[len(q)-1].Val)写在第一层for循环的最后,q=p之前的位置就可以实现一层计数最后一个了。
时间复杂度:O(n) 空间复杂度: 最坏情况O(n) 最好情况O(1)