计算二叉树叶子节点之和

给定一颗二叉树,从根节点到叶子节点组成一个数,计算一颗二叉树所有叶子节点之和

leetcode 地址:
https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/

自己的解法:

先获取叶子节点的每一个遍历的数字为数组,再对其求和
没有想到可以利用每一个节点的数字为上一个节点数字10再加上当前值*

function (root){
  let stackPtr =[];
  let stackArr = []
  let ptr = root;
  let bianli = []
  let result = []
  while(ptr){
    bianli.push(ptr.val)
    if(ptr.right){
      stackPtr.push(ptr.right)
      stackArr.push(bianli)
    }
    if(ptr.left){
      ptr = ptr.left
    }else{
      ptr = stackPtr.pop()
      if(!ptr.right) result.push([...stackArr.pop()))
    }
  }
return result.reduce((pre,cur)=>{
  return pre+=Number(cur.join(''))
  },0)
}

太复杂了

官方解法

深度遍历

如果一个节点是叶子节点,所代表的值为前一个节点的值*10加上当前值
如果一个节点有左右节点,则对其左右节点值相加即为当前节点的值

var sumNumbers =  (root)=>{
    var tree = (root,sum)=>{
        if(!root)return 0
        sum = sum*10+root.val
        if(!root.left&&!root.right){
            return sum
        }else {
            return tree(root.right,sum)+tree(root.left,sum)
        }
    }
    return tree(root,0)

}

广度遍历

对求和和当前节点建立两个队列
对叶子节点,则直接返回队首的求和值
有左右节点,前一个值*10+当前值放入队列中

var sumNumbers =  (root)=>{
    if(!root)return 0
    var stackNum = []
    var stackPtr = []
    stackNum.push(root.val)
    stackPtr.push(root)
    let result = 0
    while(stackPtr.length){
        var nodePtr = stackPtr.shift()
        var nodeNum = stackNum.shift()
        if(!nodePtr.right&&!nodePtr.left){
            result+=nodeNum
        }
         if(nodePtr.left){
            stackPtr.push(nodePtr.left)
            stackNum.push(nodeNum*10+nodePtr.left.val)
        }
         if(nodePtr.right){
            stackPtr.push(nodePtr.right)
            stackNum.push(nodeNum*10+nodePtr.right.val)
        }
    }
    return result

}

你可能感兴趣的:(计算二叉树叶子节点之和)