題面
給定一棵二叉樹,設計一個演算法,建立含有某一深度上所有節點的連結串列(比如,若一棵樹的深度為 D,則會建立出 D 個連結串列)。返回一個包含所有深度的連結串列的陣列。
示例:
輸入:[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8
輸出:[[1],[2,3],[4,5,7],[8]]
來源:力扣(LeetCode)
連結:leetcode-cn.com/problems/list-of-d...
資料結構
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
type ListNode struct {
Val int
Next *ListNode
}
分析
- 深度遞迴計算樹的層次
- 迴圈佇列每次記錄上一層節點
- 根據每層節點構建連結串列
- 外層迴圈記數,與樹的最大層比較,作為終止條件
陣列建樹
有序陣列構建二叉樹,用遞迴
分析 一維變二維,找出 父子索引關係 n,n*2+1,n*2+2
func createTree(arr []int, n int) *TreeNode {
if n > len(arr)-1 {
return nil
}
root := &TreeNode{Val: arr[n]}
root.Left = createTree(arr, n*2+1)
root.Right = createTree(arr, n*2+2)
return root
}
深度計算
求二叉樹深度,左右二選一,大者出眾
func treeDepth(root *TreeNode) int {
if root == nil {
return 0
}
left := treeDepth(root.Left)
right := treeDepth(root.Right)
if left > right {
return left + 1
} else {
return right + 1
}
}
題解
func listOfDepth(tree *TreeNode) []*ListNode {
// 計算最大深度
maxDepth := treeDepth(tree)
l := []*TreeNode{}
node := []*ListNode{}
// 記錄迴圈層次
sum := 0
for {
t := []*TreeNode{}
for i := 0; i < len(l); i++ {
if l[i].Left != nil {
t = append(t, l[i].Left)
}
if l[i].Right != nil {
t = append(t, l[i].Right)
}
}
if len(l) < 1 {
t = []*TreeNode{tree}
}
l = t
sum++
// 生成連結串列頭
head := &ListNode{Val: t[0].Val}
prev := head
for i := 1; i < len(t); i++ {
prev.Next = &ListNode{Val: t[i].Val}
prev = prev.Next
}
// 加入連結串列
node = append(node, head)
// 外層跳出,指定層次,以及大於樹的最大深度
if sum >= maxDepth {
break
}
}
return node
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結