马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
力扣第112题:路径总和
标题形貌
给定一个二叉树和一个目的和,判断该树中是否存在从根节点到叶子节点的路径,使得路径上的节点值之和即是给定的目的和。
叶子节点 是指没有子节点的节点。
解题思绪
要办理这个题目,我们可以利用 深度优先搜索(DFS) 或 广度优先搜索(BFS) 来遍历树。最直观的方法是通过 递归 举行深度优先遍历,查抄是否存在从根节点到叶子节点的路径,使得路径和即是目的值。
- 递归 DFS:从根节点开始遍历,对于每个节点,减去当前节点的值,然后递归地查抄左右子树是否存在目的和。如果某个叶子节点的路径和恰好即是目的值,则返回 true,否则返回 false。
- 路径和盘算:每次递归时,我们将当前节点的值从目的和中减去,直到找到一个叶子节点,且此时目的和为0,则阐明找到了满足条件的路径。
解法步调
- 从根节点开始递归,判断当前节点是否是叶子节点。
- 如果当前节点是叶子节点,查抄路径和是否即是目的值。
- 如果当前节点不是叶子节点,递归查抄左右子树。
- 若找到符合条件的路径,返回 true,否则返回 false。
代码实现(C 语言)
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- // 二叉树节点结构体
- struct TreeNode {
- int val;
- struct TreeNode *left;
- struct TreeNode *right;
- };
- // 递归判断是否存在路径和
- bool hasPathSum(struct TreeNode* root, int targetSum) {
- if (root == NULL) {
- return false; // 空树没有路径
- }
-
- // 如果当前节点是叶子节点
- if (root->left == NULL && root->right == NULL) {
- return targetSum == root->val; // 判断当前路径和是否等于目标值
- }
-
- // 递归检查左右子树
- targetSum -= root->val;
- return hasPathSum(root->left, targetSum) || hasPathSum(root->right, targetSum);
- }
- // 辅助函数:创建树节点
- struct TreeNode* createNode(int val) {
- struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
- node->val = val;
- node->left = node->right = NULL;
- return node;
- }
- // 测试代码
- int main() {
- struct TreeNode* root = createNode(5);
- root->left = createNode(4);
- root->right = createNode(8);
- root->left->left = createNode(11);
- root->left->left->left = createNode(7);
- root->left->left->right = createNode(2);
- root->right->left = createNode(13);
- root->right->right = createNode(4);
- root->right->right->right = createNode(1);
- int targetSum = 22;
- if (hasPathSum(root, targetSum)) {
- printf("There is a path with sum %d.\n", targetSum);
- } else {
- printf("There is no path with sum %d.\n", targetSum);
- }
- return 0;
- }
复制代码 代码剖析
- 树布局:TreeNode 布局体界说了二叉树节点,包罗节点值 val 和左右子树指针 left 和 right。
- 递归判断路径和:
- 如果当前节点为空,返回 false,表现没有路径。
- 如果当前节点是叶子节点,判断路径和是否即是目的值,如果相称则返回 true,否则返回 false。
- 否则,递归盘算左右子树的路径和。
- 创建节点函数:createNode 用于创创建的节点,在 main 函数中用来构建一个测试用的二叉树。
- 测试代码:在 main 函数中,我们构造了一个测试用例,并盘算了树中是否存在符合要求的路径。
时间复杂度与空间复杂度
- 时间复杂度:O(n)O(n)O(n),此中 nnn 是二叉树的节点数。每个节点都会被访问一次,且每次访问时举行常数时间的利用。
- 空间复杂度:O(h)O(h)O(h),此中 hhh 是树的高度。递归调用栈的空间复杂度与树的高度成正比,最坏情况下(树退化为链表时),空间复杂度为 O(n)O(n)O(n),而在平衡树的情况下,空间复杂度为 O(logn)O(\log n)O(logn)。
|