leetcode 1022. 从根到叶的二进制数之和

100 阅读2分钟

[toc] leetcode 1022. 从根到叶的二进制数之和.

题目描述

  1. 从根到叶的二进制数之和

给出一棵二叉树,其上每个结点的值都是 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

提示:

树中的节点数在 [1, 1000] 范围内 Node.val 仅为 0 或 1

解题思路

法1

模拟+深度优先遍历(先序遍历)

  1. 使用先序遍历遍历树的所有节点,

  2. 计算从根节点到子节点的值并记录

  3. 记录所有数的和

  • 时间复杂度(O(n))
  • 空间复杂度(O(1))

执行结果

法1

用深度优先搜索 (DFS) 的方式遍历二叉树,通过每次将路径上的节点值左移一位并加上当前节点的值来构造路径所表示的二进制数。

当遍历到叶子节点时,将当前路径所代表的数字返回。

func sumRootToLeaf(root *TreeNode) int {
	return dfs(root, 0)
}
//计算二进制和
func dfs(node *TreeNode, pathSum int) int {
	if node == nil {
		return 0
	}
//左移
	pathSum = (pathSum << 1) + node.Val
//返回条件
	if node.Left == nil && node.Right == nil {
		return pathSum
	}
//计算左右子节点和
	return dfs(node.Left, pathSum) + dfs(node.Right, pathSum)
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 4 ms , 在所有 Go 提交中击败了 61.02% 的用户 内存消耗: 3 MB , 在所有 Go 提交中击败了 100.00% 的用户 通过测试用例: 63 / 63 炫耀一下:

本文由mdnice多平台发布