112.path-sum

给定一棵二叉树和一个总和,确定该树中是否存在根到叶的路径,这条路径的所有值相加等于给定的总和。

例如:
给定下面的二叉树和 总和 = 22

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1

返回 true, 因为存在总和为 22 的根到叶的路径 5->4->11->2


解题思路:

    从左往右搜索到最深处即可


解题代码:

from collections import deque
class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if root:
            queue = deque([(root, root.val)])
            while queue:
                p, s = queue.popleft()
                left, right = p.left, p.right
                if left:
                    queue.append((p.left, s + p.left.val))
                if right:
                    queue.append((p.right, s + p.right.val))
                if not left and not right and s == sum:
                    return True
            return False
        return False
注意:判断条件的地方只能用right和left,不能为p.left or p.right
下面是根据伪代码写出的 Matlab 程序: ```matlab function [Vmin, Path] = circle_arrangement(R) % R:待排列的圆的半径,大小为 n×1 的向量 % Vmin:最小圆排列距离 % Path:最优排列方案 n = length(R); Vmin = inf; % 初始距离为无穷大 Path = []; % 初始最优排列方案为空 % 计算代价函数的值 function [val, bound] = cost_func(X, k) if k == n % 叶子节点 val = sum(X) - 1; % 当前价值为已选圆的数量减1 bound = val; else % 非叶子节点 val = sum(X(1:k)); % 当前价值为已选圆的数量 remain_R = R(~X(1:k)); % 剩余圆的半径 [~, idx] = sort(remain_R, 'ascend'); % 按半径从小到大排序 i = 1; cap = 0; while i <= length(remain_R) && cap + remain_R(idx(i)) <= 1 - sum(X(1:k)) cap = cap + remain_R(idx(i)); i = i + 1; end if i <= length(remain_R) bound = val + cap/remain_R(idx(i)); else bound = val + cap/remain_R(end); end end end ANode = zeros(n+1, n); % 待处理节点矩阵 ANode(1,:) = 1:n; % 第一行是圆的编号 ANode(n+1,:) = ones(1,n); % 最后一行是已确定部分数量 [AVal, ABound] = cost_func(ANode(1,:), ANode(n+1,:)); % 计算初始节点的价值上界 while ~isempty(ANode) [~, loc] = min(ABound); % 找到价值上界最小的节点 X = ANode(1:n, loc); % 当前节点对应的排列方案 k = ANode(n+1, loc); % 已确定部分的数量 if ABound(loc) >= Vmin % 剪枝 ANode(:, loc) = []; AVal(loc) = []; ABound(loc) = []; else for i = setdiff(1:n, X(1:k)) % 枚举下一个圆的编号 next_X = [X; i]; % 加入下一个圆 next_k = k + 1; [next_val, next_bound] = cost_func(next_X, next_k); % 计算价值上界 if next_k < n && next_bound < Vmin % 非叶子节点且上界小于当前最优解 next_ANode = [next_X; next_k]; % 新节点 ANode = [ANode, next_ANode]; % 加入新节点 AVal = [AVal, next_val]; % 记录新节点的价值 ABound = [ABound, next_bound]; % 记录新节点的上界 elseif next_k == n % 叶子节点 next_val = next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值