【题目】
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位 整数。
示例 1:
输入:root = [1,0,1,0,1,0,1]
输出:22
解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
示例 2:
输入:root = [0]
输出:0
示例 3:
输入:root = [1]
输出:1
示例 4:
输入:root = [1,1]
输出:3
提示:
树中的结点数介于 1 和 1000 之间。
Node.val 为 0 或 1 。
【代码】
【方法1-迭代法】
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sumRootToLeaf(self, root: TreeNode) -> int:
ans=0
stack=[]
prev=None
while stack or root:
while root:
stack.append(root)
root=root.left
if not stack[-1].left and not stack[-1].right:
#将stack数组转换成十进制数字
s="0b"+"".join([str(x.val) for x in stack])
ans+=eval(s)
root=stack.pop()
if not root.right or root.right==prev:
prev=root
root=None
else:
stack.append(root)
root=root.right
return ans
【方法2-递归法】
class Solution:
def sumRootToLeaf(self, root: TreeNode) -> int:
# 逐层遍历,反向递归
return self.bin_sum(root, 0)
def bin_sum(self, root, sum_r):
if not root:
return 0
else:
sum_r = sum_r * 2 + root.val
if not root.left and not root.right:
return sum_r
return self.bin_sum(root.left, sum_r) + self.bin_sum(root.right, sum_r)