25-1-二叉树路径和并记录所有满足条件的路径

一、题目描述

给定一个二叉树和一个和,找到每个路径的总和等于给定总和的所有根到叶路径。
【举例】
给定下面的二叉树,以及和 sum = 22,
         5
       /   \
     4      8
    /       / \
  11    13   4
  /  \   /  \
7    2 5   1
返回:
[
   [5,4,11,2],
   [5,8,4,5]

]

二、解题算法

1、判断二叉树是否有和为指定sum的情况

/*********************************************
Author:tmw
date:2018-5-8
*********************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode
{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

/**
几个注意点:
    1)题目要求返回true/false,不需要记录路径
    2)给定结点没说是正整数,因此必须走到叶子结点才知道是否找到,没法剪枝,只能朴素深度搜索
    3)一旦找到sum结果,立即return
**/
bool hasPathSum(TreeNode* root, int sum)
{
    if( !root ) return false;

    /**走到叶子结点,判断当前sum值与叶子结点值是否相等**/
    if( root->left == NULL && root->right == NULL )
        return root->val == sum;
    /**没走到叶子结点:左右孩子都可以走,更新sum**/
    return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
}

2、返回和为指定sum的路径

/*******************************************
Author:tmw
date:2018-5-8
*******************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode
{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

/**
 *returnSize  -- 返回的结果数组有多少组
 **columnSizes -- 返回的结果数组每一组有多少个元素
*/
#define MAX_SIZE 1000
/**
    *cur_array : 用于暂存中间值
    **result  : 最终满足和为sum的所有路径
    *colmn_size : 用于记录每条路径有多少元素
**/
int i=0;
int count = 0;
int colmn_size[MAX_SIZE];
void get_pathSum( TreeNode* root, int sum, int* cur_array, int** result )
{
    if( root==NULL ) return;

    cur_array[i++] = root->val;

    /**当遍历到叶子结点时,判断该路径下的和值是否满足sum,满足则记录到result数组中**/
    if( root->left == NULL && root->right == NULL )
    {
        /**满足则记录到result数组中**/
        if( root->val == sum )
        {
            int j;
            for( j=0; j<i; j++ )
                result[count][j] = cur_array[j];
            colmn_size[count] = i;
            count++;
        }
    }

    /**记录左子树路径**/
    get_pathSum( root->left, sum-root->val, cur_array, result);
    /**记录右子树路径**/
    get_pathSum( root->right, sum-root->val, cur_array, result);
}

int** pathSum(TreeNode* root, int sum, int** columnSizes, int* returnSize)
{
    if( root == NULL ) return NULL;

    /**自定义二维的结果数组,用来存储最终结果并返回**/
    int** result = (int**)malloc(MAX_SIZE*sizeof(int*));
    int ii;
    for( ii=0; ii<MAX_SIZE; ii++ )
        result[ii] = (int*)malloc(MAX_SIZE*sizeof(int));

    /**自定义临时一维数组用于暂存结果值**/
    int* temp_res = (int*)malloc(MAX_SIZE*sizeof(int));

    get_pathSum(root,sum,temp_res,result);

    /**赋值**/
    *returnSize = count;
    printf("%d",count);
    for( ii=0;ii<count;ii++ )
        (*columnSizes)[ii] = colmn_size[ii];

    return result;
}


梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80874912