面试题 04.03. 特定深度节点链表
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。
示例:
输入:[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8
输出:[[1],[2,3],[4,5,7],[8]]
DFS
/**
* 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) (res []*ListNode) {
return DFS(tree, 0, res)
}
func DFS(tree *TreeNode, level int, res []*ListNode ) []*ListNode{
if tree == nil{
return res
}
NewNode := &ListNode{tree.Val, nil}
if len(res) < level+1 {
res = append(res, NewNode)
}else {
cur := res[level]
for cur.Next != nil {
cur = cur.Next
}
cur.Next = NewNode
}
res = DFS(tree.Left, level+1, res)
res = DFS(tree.Right, level+1, res)
return res
}
BFS
/**
* 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 {
if tree == nil {
return nil
}
res := make([]*ListNode, 0)
list := make([]*TreeNode, 0)
list = append(list, tree)
for len(list) > 0 {
size := len(list)
var node, head *ListNode
for i:=0; i< size; i++ {
if i == 0 {
node = &ListNode{Val: list[i].Val}
head = node
} else {
node.Next = &ListNode{Val: list[i].Val}
node = node.Next
}
if list[i].Left != nil {
list = append(list, list[i].Left)
}
if list[i].Right != nil {
list = append(list, list[i].Right)
}
}
if head != nil {
res = append(res, head)
}
list = list[size:]
}
return res
}