如何使用一行代码遍历二叉树累加求值?

问题背景

如何想起里这个问题的,主要是在给成员讲解数组reduce方法的时候想到的。

传给 reduce()和 reduceRight()的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项 

讲到函数返回的任何值都会作为第一个参数自动传给下一项的好处。

 

二叉树遍历计算求值问题 【不借助变量去计算所有节点累加值】

var a = [{
    count: 1,
    name: 'a',
    children: [{
        count: 2,
        name: 'b',
        children: [{
            count: 3,
            name: 'c'
        },
        {
            count: 4,
            name: 'd'
        }]
    },
    {
        count: 5,
        name: 'e',
        children: [{
            count: 6,
            name: 'f'
        },
        {
            count: 7,
            name: 'g'
        }]
    }]
}]

 

解决思路

不借助变量计算数据的话,那就只有可以自主进行数值计算。正好可以借用这个方法的特性实现,然后一行代码的情况就需要考虑带自调用,然后具有一定的链式效果

 

实现方法

var a = [{
    count: 1,
    name: 'a',
    children: [{
        count: 2,
        name: 'b',
        children: [{
            count: 3,
            name: 'c'
        },
        {
            count: 4,
            name: 'd'
        }]
    },
    {
        count: 5,
        name: 'e',
        children: [{
            count: 6,
            name: 'f'
        },
        {
            count: 7,
            name: 'g'
        }]
    }]
}]

console.log((function countF(a) {
    return a.reduce(function(x, y) {
        if (y.children) {
            // 存在子节点的情况下
            return x + y.count + countF(y.children)
        } else {
            // 不存在子节点的情况下
            return x + y.count
        }

    },
    0)
})(a))

返回结果

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页