经典算法实例:从根到叶的二进制数之和
我们先来看题目描述:
在二维平面上的 x 轴上,放置着一些方块。
给出一棵二叉树,其上每个结点的值都是 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
解决方案
方法:递归
后序遍历的访问顺序为:左子树——右子树——根节点。我们对根节点 root 进行后序遍历:
如果节点是叶子节点,返回它对应的数字 val 。
如果节点是非叶子节点,返回它的左子树和右子树对应的结果之和。
代码
Python3
class Solution: def sumRootToLeaf(self, root: Optional[TreeNode]) -> int: def dfs(node: Optional[TreeNode], val: int) -> int: if node is None: return 0 val = (val << 1) | node.val if node.left is None and node.right is None: return val return dfs(node.left, val) + dfs(node.right, val) return dfs(root, 0) JavaC++
class Solution { public: int dfs(TreeNode *root, int val) { if (root == nullptr) { return 0; } val = (val << 1) | root->val; if (root->left == nullptr && root->right == nullptr) { return val; } return dfs(root->left, val) + dfs(root->right, val); } int sumRootToLeaf(TreeNode* root) { return dfs(root, 0); } };C
int dfs(struct TreeNode *root, int val) { if (root == NULL) { return 0; } val = (val << 1) | root->val; if (root->left == NULL && root->right == NULL) { return val; } return dfs(root->left, val) + dfs(root->right, val); } int sumRootToLeaf(struct TreeNode* root){ return dfs(root, 0); }