這篇文章主要為大家展示了“golang刷leetcode 技巧之如何實現特定深度節點鏈表”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“golang刷leetcode 技巧之如何實現特定深度節點鏈表”這篇文章吧。
給定一棵二叉樹,設計一個算法,創建含有某一深度上所有節點的鏈表(比如,若一棵樹的深度為 D,則會創建出 D 個鏈表)。返回一個包含所有深度的鏈表的數組。
示例:
輸入:[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8
輸出:[[1],[2,3],[4,5,7],[8]]
解題思路
1,這是一道樹的層序遍歷+鏈表的組合題,主要考察樹、隊列、鏈表的理解、以及這幾種數據結構的綜合應用。
2,樹的層序遍歷,需要借助隊列,對于每一層都分開需要借助兩個隊列
3,遍歷的時候,我們將q1 這一層的每一個節點依次彈出,放入鏈表
4,將每一個節點的左右孩子依次存入q2
5,將q2存入q1
6,重復3~5,直到每個隊列都為空為止。
代碼實現
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func listOfDepth(tree *TreeNode) []*ListNode {
var q1,q2 queue
if tree==nil{
return nil
}
var r []*ListNode
q1.push(tree)
head:=new(ListNode)
for !q1.empty() || !q2.empty(){
cur:=head
for !q1.empty(){
x:=q1.pop()
if x.Left!=nil{
q2.push(x.Left)
}
if x.Right!=nil{
q2.push(x.Right)
}
cur.Next=&ListNode{
Val:x.Val,
}
cur=cur.Next
}
r=append(r,head.Next)
head.Next=nil
for !q2.empty(){
q1.push(q2.pop())
}
}
return r
}
type queue struct{
data []*TreeNode
}
func(this*queue)push(t*TreeNode){
this.data=append(this.data,t)
}
func (this*queue)empty()bool{
return len(this.data)<1
}
func (this*queue)pop()*TreeNode{
if this.empty(){
return nil
}
x:=this.data[0]
this.data=this.data[1:]
return x
}
以上是“golang刷leetcode 技巧之如何實現特定深度節點鏈表”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。