剑指offer-24:二叉树中为某一值的路径

二叉树中和为某一值的路径

https://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca?tpId=13&&tqId=11177&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目:输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
示例1
输入:{10,5,12,4,7},22
返回值:[[10,5,7],[10,12]]
示例2
输入:{10,5,12,4,7},15
返回值:[]

思路:
1:采用递归的思想,先序遍历
2:分析题目,根节点到叶子节点的和为指定数值,所以递归判断的条件是:没有左子树也没有右子树,然后进行判断
3:解题,采用dfs方法,每次递归,都往数组里面塞入左节点或者右节点,传入的expectNumber都减去当前结点的数值,一旦该结点既没有左子树了也没有右子树了,就进行判断,判断的是sum数值是否与最后一个结点的数值相等(也可以是sum-最后一个结点是否等于0).

坑点:dfs内部要采用[...path]扩展运算符的方法来进行递归,我刚开始没理解,但是后面我觉得,大概大概是因为数组本身是引用类型,如果直接写path会导致引用相同的数组导致出错,出错的情况就是结果数量正确,但是每一个正确的数组都是全部的数组,需要通过[...path]浅拷贝的方式来进行复制.浅拷贝后的数组,内部元素全都是基本数据类型,不存在引用数据类型,所以增加元素不会发生牵连影响

function FindPath(root, expectNumber)
{
    // write code here
    if(!root) return []
    let res = []
    function dfs(root,path,sum){
        if(!root) return
        path.push(root.val)
        if(!root.left && !root.right){
            if(sum == root.val) res.push(path)
        }
        if(root.left) dfs(root.left,[...path],sum-root.val)
        if(root.right) dfs(root.right,[...path],sum-root.val)
    }
    dfs(root,[],expectNumber)
    return res
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务