剑指offer.二叉树中和为某一值的路径

题目:

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从数的根节点开始往下一直到叶节点所经历过的节点形成一条路径。

思路:

在之前数据结构的学习中我们都没提起过树的路径的概念。相当于一个新概念,对于新概念我们通常寻找解题思路都是从用例子入手来寻找普遍规律。要计算路径的节点值其实计算的起点都是根节点,所以遍历二叉树我们还是用先序遍历,遍历了根节点后,把根节点记录入到一个容器里面去,然后遍历左子节点,再往下遍历,如果发现遍历的路径的节点加起来不等于预设置的值的话,我们就往前退一步,再往另外一个子节点遍历,其实仔细想想这个容器其实就是一个栈,先进后出的特点。

代码 实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
#define MAX_SIZE 10001
void traversal(struct TreeNode* root, int target, int* path, int** res, 
               int* returnSize, int** returnColumnSizes, int nums) {
    if (!root->left && !root->right && root->val == target) {
        path[nums++] = root->val;
        res[*returnSize] = (int*)malloc(sizeof(int) * nums);
        (*returnColumnSizes)[*returnSize] = nums;
        for (int i = 0; i < nums; i++) {
            res[*returnSize][i] = path[i];
        }
        (*returnSize)++;
    } else {
        path[nums++] = root->val;
        if (root->left) {
            traversal(root->left, target - root->val, path, res, returnSize, returnColumnSizes, nums);
        }
        if (root->right) {
            traversal(root->right, target - root->val, path, res, returnSize, returnColumnSizes, nums);
        }
    }
}
int** pathSum(struct TreeNode* root, int target, int* returnSize, int** returnColumnSizes) {
    if (!root) {
        *returnSize = 0;
        *returnColumnSizes = NULL;
        return NULL;
    }
    *returnSize = 0;
    *returnColumnSizes = (int*)malloc(sizeof(int) * MAX_SIZE);
    int** res = (int**)malloc(sizeof(int*) * MAX_SIZE);
    int* path = (int*)malloc(sizeof(int) * MAX_SIZE);
    int nums = 0;
    traversal(root, target, path, res, returnSize, returnColumnSizes, nums);
    return res;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值