【二叉树】从根到叶的二进制数之和

0x00 题目

给出一棵二叉树,其上每个结点的值都是 01
每一条从根到叶的路径
都代表一个从 最高 有效位开始的 二进制

例如,如果路径为 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)
}


小编辑器

请添加图片描述


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪冷啊

你的鼓励是对我的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值