LeetCode算法第4篇:257 Binary Tree Paths

本文介绍了一种使用C语言实现获取二叉树所有根节点到叶子节点路径的方法。通过深度优先遍历的方式,递归地构建路径字符串。文章详细展示了如何处理左右子树的情况,并注意到了内存管理和指针操作的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
Given a binary tree, return all root-to-leaf paths.

For example, given the following binary tree:

   1
 /   \
2     3
 \
  5

All root-to-leaf paths are:

["1->2->5", "1->3"]

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */

char **findTreePath(struct TreeNode* root, int *returnSize);

char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
    return findTreePath(root, returnSize);
}

char **findTreePath(struct TreeNode* root, int *returnSize)
{
    char **pRightTree, **pLeftTree, **pReturn;
    int i, rightSize, leftSize;

    if (NULL == root)
        return NULL;

    if (NULL != root->right)
    {
        pReturn = findTreePath(root->right, returnSize);
        pRightTree = (char **)malloc(sizeof(char *) * (*returnSize));
        rightSize = *returnSize;
        for (i = 0; i < (*returnSize); i++)
        {
            pRightTree[i] = (char *)malloc(sizeof(char) * (strlen(pReturn[i]) + 13) );
            sprintf(pRightTree[i], "%d->%s", root->val, pReturn[i]);
            free(pReturn[i]);
        }
        free(pReturn);
    }

    if (NULL != root->left)
    {
        pReturn = findTreePath(root->left, returnSize);
        pLeftTree = (char **)malloc(sizeof(char *) * (*returnSize));
        leftSize = *returnSize;
        for (i = 0; i < (*returnSize); i++)
        {
            pLeftTree[i] = (char *)malloc(sizeof(char) * (strlen(pReturn[i]) + 13));
            sprintf(pLeftTree[i], "%d->%s", root->val, pReturn[i]);
            free(pReturn[i]);
        }
        free(pReturn);
    }

    if (NULL == root->right && NULL == root->left)
    {
        pLeftTree = (char **)malloc(sizeof(char *) * 1);
        pLeftTree[0] = (char *)malloc(sizeof(char) * 12);
        sprintf(pLeftTree[0], "%d", root->val);
        *returnSize = 1;
    } else {
        if (NULL != root->left && NULL != root->right)
        {
            pLeftTree = (char **)realloc(pLeftTree, sizeof(char *) * (leftSize + rightSize));
            memcpy(pLeftTree + leftSize, pRightTree, sizeof(char *) * rightSize);
            free(pRightTree);
            *returnSize = (leftSize + rightSize);
        } else if (NULL == root->left){
            pLeftTree = pRightTree;
            *returnSize = rightSize;
        } else {

        }
    }

    return pLeftTree;
}

总结:算法思路很简单,就是个二叉树的深度优先遍历,通过判断左右子树是否为空递归遍历。但用C语言实现算法存在大量的指针、指针的指针以及内存分配的操作,一不小心就会出现野指针和数组越界的问题。
  第一次运行的时候出现编译警告说findTreePath函数没有显示声明,将findTreePath函数在binaryTreePaths函数前声明一下后编译通过;第二次运行时出现Runtime Error,提示当输入为空树时输出错误,在25-26行加入空树判断;第三次运行时又出现Runtime Error,这次没了提示搞了半天没出来,转到IDE中自己建个样例试了一下发现输出结果时指针数组中的字符串出现顺序左右反了,回到代码一看原来在findTreePath函数第62-75行代码合并左右子树结果时将左子树的并到右子树后边去了,修改之后再次提交通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值