题目:
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从数的根节点开始往下一直到叶节点所经历过的节点形成一条路径。
思路:
在之前数据结构的学习中我们都没提起过树的路径的概念。相当于一个新概念,对于新概念我们通常寻找解题思路都是从用例子入手来寻找普遍规律。要计算路径的节点值其实计算的起点都是根节点,所以遍历二叉树我们还是用先序遍历,遍历了根节点后,把根节点记录入到一个容器里面去,然后遍历左子节点,再往下遍历,如果发现遍历的路径的节点加起来不等于预设置的值的话,我们就往前退一步,再往另外一个子节点遍历,其实仔细想想这个容器其实就是一个栈,先进后出的特点。
代码 实现:
/**
* 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;
}