题解 | #二叉树的前序遍历#
二叉树的前序遍历
https://www.nowcoder.com/practice/5e2135f4d2b14eb8a5b06fab4c938635
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return int整型一维数组 * @return int* returnSize 返回数组行数 */ #include <stdio.h> void preorder(struct TreeNode* cur, int*ret,int * returnSize) { if (cur == NULL) return;//先判断当前节点是否为空 ret[*returnSize]=cur->val; // 存储根节点 (*returnSize)++;//存储组加一 preorder(cur->left, ret,returnSize); // 左递归 preorder(cur->right, ret,returnSize); // 右递归 } int* preorderTraversal(struct TreeNode* root, int* returnSize ) { int *ret=(int*)malloc(sizeof(int )*100);//为ret数组分配空间 *returnSize=0;//数组长度 preorder(root, ret,returnSize);//引用函数; return ret; }
先从简单题走起:
二叉树的递归调用算法:
题中返回int* 型数组首地址,int*型数组大小地址returnsize,给到了一个根节点指针root,这里首先要注意,先要为返回的数组申请空间,
这里解释一下为什么必须分配空间,这是因为a[10]这中空间是在栈上分配空间的,malloc是在堆上分配空间的在函数返回时,栈上的空间会被自动释放,而使用 malloc 分配空间则可避免这个问题。前者导致内存泄漏或者未定义的行为,例如错误运行结果导致内存泄漏输出为
同时这里的returnsize 也是在提醒分配内存空间的意思。
然后我们初始化returnsize,调用递归;
这里的递归函数很好写,首先判断节点是不是空,如果是直接return,如果不是,先把根节点的val存入数组,再调用递归把左节点放进函数走,如果左节点走完,就会退出左递归,再调用右递归同样操作,最终返回数组首地址。