文章目录
刷题前唠嗑
LeetCode? 启动!!!
题目:填充每个节点的下一个右侧节点指针 II
题目描述
代码与解题思路
go
/**
* Definition for a Node.
* type Node struct {
* Val int
* Left *Node
* Right *Node
* Next *Node
* }
*/
func connect(root *Node) *Node {
if root == nil {
return nil
}
Queue := []*Node{root}
for Queue != nil {
tmp := Queue
Queue = nil
for i, node := range tmp {
if i > 0 { // 层序过程中,连接一下指针
tmp[i-1].Next = node
}
if node.Left != nil {
Queue = append(Queue, node.Left)
}
if node.Right != nil {
Queue = append(Queue, node.Right)
}
}
}
return root
}
最近刚好刷了不少层序遍历的题目,上手就是一套层序遍历模板框框拿下,直接在层序遍历的途中加一句:tmp[i-1].Next = node 把每一层需要连接的 Next 指针全部连上就行
不过这样做空间复杂度就是 O(N) 了,题目有个进阶要求,说要整 O(1) 的空间复杂度,有一说一,我想不出来咋做,他有提示说可以用递归来做,但是我递归水平一般,想不出什么好法子
偷学大佬题解
然后我去题解区偷学大佬题解了:
go
/**
* Definition for a Node.
* type Node struct {
* Val int
* Left *Node
* Right *Node
* Next *Node
* }
*/
func connect(root *Node) *Node {
head := &Node{} // 哨兵位的头结点
cur := root
for cur != nil {
head.Next = nil
node := head
for cur != nil { // 把下一层的 Next 都接上
if cur.Left != nil {
node.Next = cur.Left
node = cur.Left
}
if cur.Right != nil {
node.Next = cur.Right
node = cur.Right
}
cur = cur.Next // 当前层的下一个节点(上一层的时候接上了)
}
cur = head.Next // 这里的设计非常巧妙,head.Next 是下一层的第一个节点
}
return root
}
他这个设计太巧妙了,将真个二叉树当成一个链表不断遍历,只设置了一个哨兵位的头结点来更方便的操作,最巧妙的操作就是 cur 和 head.Next 交接的设计,我反正是学不会啊,只能说长见识了,以后多学多练,希望有一天也能对这些牛逼的操作信手拈来
结语
今天周五了,刷个每日一题都开心起来了~