通过这道题的引用,学习sprintf函数,以及DFS,巧妙地使用一个countpath数组(这里注意是整型,所有后面用了sprintf函数来存入元素)记录了每一条路,虽然每一次调用时该数组的名称是一样的,但是每条不同路径里(也就是T->left或者T->right)countpath都不一样,再在遇到叶子结点是,动态分配一块空间char类型的stor来从count path中读出该条路径的元素。
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
示例 2:
输入:root = [1] 输出:["1"]
提示:
- 树中节点的数目在范围
[1, 100]
内 -100 <= Node.val <= 100
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void countpath(struct TreeNode* T,int top,char** path,int* returnSize,int*curpath){
if(T){
if(!T->left&&!T->right){
char* stor=(char*)malloc(9999);
//char stor[9999];不知道为什么这么写就错
int len=0;
for(int i=0;i<top;i++){
len+=sprintf(stor+len,"%d->",curpath[i]);
}
sprintf(stor+len,"%d",T->val);
path[(*returnSize)++]=stor;
}
else{
curpath[top++]=T->val;
countpath(T->left,top,path,returnSize,curpath);
countpath(T->right,top,path,returnSize,curpath);
}
}
}
char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
char** path=(char**)malloc(sizeof(char)*9990);
*returnSize=0;
int currentpath[9999];
countpath(root,0,path,returnSize,currentpath);
return path;
}