原题页面: https://oj.leetcode.com/problems/sum-root-to-leaf-numbers/
题目类型:递归回溯,二叉树
难度评价:★
本文地址: http://blog.csdn.net/nerv3x3/article/details/37338753
Given a binary tree containing digits from 0-9
only, each root-to-leaf path could represent a number.
An example is the root-to-leaf path 1->2->3
which represents the number123
.
Find the total sum of all root-to-leaf numbers.
For example,
1 / \ 2 3
The root-to-leaf path 1->2
represents the number 12
.
The root-to-leaf path 1->3
represents the number 13
.
Return the sum = 12 + 13 = 25
.
从根节点到叶子节点的路径代表一个数值,找出所有的这些数值然后累加得到一个和。
搜索算法可以用来找可行解,或者找出全部解。找可行解的时候可以用深度优先遍历DFS,或者广度优先遍历BFS。而这个题目则是找出全部解,然后累加全部解。而搜索算法找全部解时的递归解法一般也是两种:自底向上和自顶向下(自己命名的,哈哈)。
就拿这道题来说,自底向上,也就是当递归到叶子节点后,在递归退栈的过程中,让左子树递归返回的数加上右子树递归返回的数。
class Solution:
def doSumNumbers(self, root, val):
if None == root.left and None == root.right:
return val * 10 + root.val
left = 0
right = 0
if None != root.left:
left = self.doSumNumbers(root.left, val * 10 + root.val)
if None != root.right:
right = self.doSumNumbers(root.right, val * 10 + root.val)
return left + right
# @param root, a tree node
# @return an integer
def sumNumbers(self, root):
if None == root:
return 0
return self.doSumNumbers(root, 0)
而自顶向下,其实就是所谓的尾递归了。判断一个递归是不是尾递归,当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。
class Solution:
def __init__(self):
self.sum = 0
def doSumNumbers(self, root, val):
if None == root.left and None == root.right:
self.sum += val * 10 + root.val
if None != root.left:
self.doSumNumbers(root.left, val * 10 + root.val)
if None != root.right:
self.doSumNumbers(root.right, val * 10 + root.val)
# @param root, a tree node
# @return an integer
def sumNumbers(self, root):
if None == root:
return 0
self.doSumNumbers(root, 0)
return self.sum