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

Posted 耳东蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用一行代码遍历二叉树累加求值?相关的知识,希望对你有一定的参考价值。

问题背景

如何想起里这个问题的,主要是在给成员讲解数组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))

返回结果

 

以上是关于如何使用一行代码遍历二叉树累加求值?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 二叉树专项把二叉搜索树转换为累加树(538)

二叉树的所有路径和——中等难度

PHP遍历二叉树

222完全二叉树的节点个数

Java数据结构二叉树进阶——非递归实现前中后序遍历二叉树(深入理解二叉树)+进阶大厂面试题(一行一注释)

不一样的二叉树遍历(小学生都会)