算法 - 二叉树 二叉树是否存在一条从根到叶子的路径,路径上所有节点值之和等于 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; }
浙公网安备 33010602011771号