关于二叉树路径的遍历和处理

1,找到所有到达叶子节点的路径,用path数组记录路径

例题:力扣257. 二叉树的所有路径(JavaScript)_前端-pww的博客-CSDN博客

257. 二叉树的所有路径 :给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

分析题目:遍历所有路径,不需要处理返回值,

是叶子节点:把当前值加入路径( p+=root.val),并把路径加入结果

不是叶子节点当前值加入路径(p+=root.val+'->'),递归左右子节点

var binaryTreePaths = function(root) {
    let arr=[]
    const dd=function(root,p){
        //叶子节点
        if(root.left==null&&root.right==null){
            p+=root.val
            arr.push(p)
            return
        }
        //非叶子节点
        p+=root.val+'->'
        root.left&&dd(root.left,p)
        root.right&&dd(root.right,p)
    }
    dd(root,'')
    return arr
};

2,找到一个和为sum的到达叶子节点的路径

例题:力扣112. 路径总和(JavaScript)_前端-pww的博客-CSDN博客

112,路径总和 :给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

分析题目:找到一个和等于目标和的路径就返回true

(有返回值,就需要接收其递归过程中子节点产生的返回值)

  1. 当前为叶子节点,有两种情况,和为sum,(返回true),和不等于sum(返回false)
  2. 当前不是叶子节点,处理子节点,递归处理子节点(两个子节点有一个为true,那么结果就是true)
var hasPathSum = function(root, targetSum) {
    if(root==null){
        return false
    }
    const dd=function(root,sum){
        sum+=root.val
        //叶子节点
        if(root.left==null&&root.right==null){
            if(sum==targetSum){
                return true
            }else{
                false
            }
        }
        //非叶子节点
        if(root.left&&dd(root.left,sum)||root.right&&dd(root.right,sum)){
            return true
        }
        return false
    }
    return dd(root,0)
};

3,找到所有和为sum的到达叶子节点的路径

例题:力扣113. 路径总和 II(JavaScript)_前端-pww的博客-CSDN博客

113. 路径总和ii :给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

分析题目:遍历整棵树,不需要返回值,把符合条件的路径加入结果数组,与上一题的区别在于需要记录路径,单独处理左右节点的回溯

var pathSum = function(root, targetSum) {
    let arr=[]
    if(root==null){
        return arr
    }
    const dd=function(root,sum,p){
        sum+=root.val
        //叶子节点
        if(root.left==null&&root.right==null){
            if(sum==targetSum){
                arr.push([...p])
                return
            }else{
                return
            }
        }
        //非叶子节点,有路径,需要单独回溯
        if(root.left){
            p.push(root.left.val)
            dd(root.left,sum,p)
            p.pop()
        }
        if(root.right){
            p.push(root.right.val)
            dd(root.right,sum,p)
            p.pop()
        }
    }
    dd(root,0,[root.val])
    return arr
};

小疑问:

为什么sun不需要回溯但是path需要回溯呢?

传入数组,通过push操作,会改变原数组,所以需要回溯,但是sum是基本数据,当作参数传入函数,不会影响原来的值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值