写点什么

手撸二叉树之从根到叶的二进制数之和

发布于: 14 小时前
手撸二叉树之从根到叶的二进制数之和

Hello, 大家好,今天是我参加 8 月更文的第 17 天,今天给大家带来的关于二叉树相关的算法题是求二叉树从根到叶的二进制数之和,正文如下:

题目

给出一棵二叉树,其上每个结点的值都是 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
输入:root = [1]输出:1
输入:root = [1,1]输出:3
复制代码

解题思路

根据题目意思,我们可以使用递归方式来解答此题。


递归三部曲:


  1. 递归函数的参数以及返回值:函数的参数为传入的节点,以及一个用于记录当前路径和的值;由于要搜索整棵二叉树,所以该递归函数就不需要返回值了;

  2. 递归函数的终止条件:如果节点为空,则返回

  3. 递归函数的单层逻辑:如果遇到叶子节点,就把路径和放到返回值中,否则继续深度优先搜索左右子节点;

代码实现


/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { // 用来返回的返回值 private int sum = 0;
public int sumRootToLeaf(TreeNode root) { dfs(root, 0); return sum; }
private void dfs(TreeNode root, int curr) { // 遇到空节点,什么都不做,直接返回 if (root == null) return; // 累加当前节点的值到当前路径和中 curr = (curr << 1) + root.val; // 如果遇到叶子节点,就把路径和放到返回值中 if (root.left == null && root.right == null) sum += curr; // 继续深度优先搜索左右子节点 dfs(root.left, curr); dfs(root.right, curr); }}
复制代码

最后

复杂度分析:


  • 时间复杂度:O(n)。其中 n 为树的深度。

  • 空间复杂度:O(n)。递归所需的栈空间大小为 n 。

发布于: 14 小时前阅读数: 2
用户头像

佛系编码 2019.05.13 加入

红鲤鱼与绿鲤鱼与驴。

评论

发布
暂无评论
手撸二叉树之从根到叶的二进制数之和