问题

最近在刷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
            }
        }

    }
}

大家细读一下,不知道有没有看出来哪里不对,我先贴一下结果 test case