问题
最近在刷leedcode,求二叉树的路径和,给定一个二叉树,求所有符合条件的路径。原题见 113. Path Sum II
这道题需要遍历所有的节点,并且记录遍历路径上的节点,可以使用回溯法,深度优先的方法。
不过最近用习惯了广度优先的方法,把二叉树变成一个有序的队列,这种思想很好玩,把多个选择的,需要遍历的变成一个有序的来进行遍历即可,就是一个万能模板。
下面贴下代码
var result [][]int
var ch = make(chan *TreeNode, 100)
var sumChan = make(chan int, 100)
var nodes = make(chan []int, 100)
for len(ch) > 0 {
for i := 0; i < len(ch); i++ {
//获取当前节点
cur := <-ch
//获取父节点的总和
parentSum := <-sumChan
//获取父节点的所有路径节点序列
parents := <-nodes
//当前节点的总和
curSum := parentSum + cur.Val
//当前节点的序列
curNodes := append(parents, cur.Val)
if cur.Left == nil && cur.Right == nil {
if curSum == targetSum {
// 添加当前节点序列到结果集
result = append(result, curNodes)
}
} else {
if cur.Left != nil {
ch <- cur.Left
sumChan <- cur.Val + parentSum
nodes <- curNodes
}
if cur.Right != nil {
ch <- cur.Right
sumChan <- cur.Val + parentSum
nodes <- curNodes
}
}
}
}
大家细读一下,不知道有没有看出来哪里不对,我先贴一下结果
