算法 - 二叉树 二叉树是否存在一条从根到叶子的路径,路径上所有节点值之和等于 targetSum

这道题是一道关于二叉树的算法题

这个题目有个点要特别注意,叶子节点 = 左右孩子都为 null,路径必须走到叶子才算,中途节点和等于 target 不算

这题可以采用递归法或者  BFS广度优先 队列Queue迭代法进行解答

 

// 二叉树节点定义
public class TreeNode
{
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null)
    {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

递归

 

public class Solution
{
    public bool HasPathSum(TreeNode root, int targetSum)
    {
        // 边界:空树直接返回false
        if (root == null)
        {
            return false;
        }

        // ✅ 到达叶子节点:左右都为空
        if (root.left == null && root.right == null)
        {
            // 判断当前剩余值是否等于叶子节点的值
            return targetSum == root.val;
        }

        // 递归:减去当前节点值,去左子树 OR 右子树查找
        int remain = targetSum - root.val;
        return HasPathSum(root.left, remain) || HasPathSum(root.right, remain);
    }
}

 

如果不允许用递归,就用队列迭代来实现

public bool HasPathSumIter(TreeNode root, int targetSum)
{
    if(root == null) return false;
    Queue<Tuple<TreeNode, int>> queue = new Queue<Tuple<TreeNode, int>>();
    queue.Enqueue(Tuple.Create(root, targetSum));

    while(queue.Count >0)
    {
        var item = queue.Dequeue();
        TreeNode node = item.Item1;
        int remain = item.Item2;

        if(node.left == null && node.right == null)
        {
            if(node.val == remain) return true;
        }
        if(node.left != null)
        {
            queue.Enqueue(Tuple.Create(node.left, remain - node.val));
        }
        if(node.right != null)
        {
            queue.Enqueue(Tuple.Create(node.right, remain - node.val));
        }
    }
    return false;
}

 

 

 

posted on 2026-09-27 21:08  新西兰程序员  阅读(1)  评论(0)    收藏  举报