0x00 题目
给出一棵二叉树,其上每个结点的值都是 0
或 1
每一条从根到叶的路径
都代表一个从 最高
有效位开始的 二进制
数
例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1
那么它表示二进制数 01101
,也就是 13
对树上的每一片叶子
我们都要找出从根到该叶子的路径所表示的数字
返回这些数字之和。题目数据保证答案是一个 32 位整数
0x01 思路
根据题目给出的示例
根节点在左边,子节点在右边
以题目给的示例来讲解
路径为 0 -> 1 -> 1 -> 0 -> 1
依次访问路径的步骤如下:
0
01
011
0110
01101
换个写法:
00000
00001
00011
00110
01101
发现规律了么?
对!左移!
使用 <<
向左位移!
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func sumRootToLeaf(_ root: TreeNode?) -> Int {
guard let root = root else { return 0 }
func dfs(_ root: TreeNode?, _ val: Int) -> Int {
guard let root = root else {
return 0
}
var sum = 0
// 根节点的值左移,再加上当前值
let num = val << 1 + root.val
// 到叶子节点了,返回这一条路径的值
if root.left == nil && root.right == nil {
return num
}
// 左节点不为空,继续往下
if root.left != nil {
sum += dfs(root.left, num)
}
// 右节点不为空,继续往下
if root.right != nil{
sum += dfs(root.right, num)
}
return sum
}
return dfs(root, 0)
}