当前位置:   article > 正文

LeetCode-Binary Tree Level Order Traversal II-搞定指向指针的指针和malloc的用法_指向指针的指针变量和malloc的使用

指向指针的指针变量和malloc的使用

    对于这个题目,其实就是二叉树的按层遍历,然后将按层遍历的结果倒序存放而已,正好复习一下二叉树的按层遍历。

  1. void BinTree_Level(ChainBinTree *bt,void (*oper)(ChainBinTree *p)){
  2. ChainBinTree *p;
  3. ChainBinTree *q[QUEUE_MAXSIZE];
  4. int head,tail=0;
  5. if(bt){
  6. tail=(tail+1)%QUEUE_MAXSIZE;
  7. q[tail]=bt;
  8. }
  9. while(head!=tail){
  10. head=(head+1)%QUEUE_MAXSIZE;
  11. p=q[head];
  12. oper(p);
  13. if(bt->left!=NULL){
  14. tail=(tail+1)%QUEUE_MAXSIZE;
  15. q[tail]=p->left;
  16. }
  17. if(bt->right!=NULL){
  18. tail=(tail+1)%QUEUE_MAXSIZE;
  19. q[tail]=p->right;
  20. }
  21. }
  22. return;
  23. }

    参考二叉树的按层遍历,就能写出这道题的代码,思路如下

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * struct TreeNode *left;
  6. * struct TreeNode *right;
  7. * };
  8. */
  9. /**
  10. * Return an array of arrays of size *returnSize.
  11. * The sizes of the arrays are returned as *columnSizes array.
  12. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
  13. */
  14. int GetdepthofTree(struct TreeNode* root){
  15. if (!root) return 0;
  16. int left = GetdepthofTree(root->left);
  17. int right = GetdepthofTree(root->right);
  18. if (left > right)
  19. return left+1;
  20. else
  21. return right+1;
  22. }
  23. int** levelOrderBottom(struct TreeNode* root, int** columnSizes, int* returnSize) {
  24. if (!root){
  25. return NULL;
  26. }
  27. //获取二叉树的深度,最大层数或者说
  28. int depth = *returnSize = GetdepthofTree(root);
  29. //ret是一个指向一个二维数组的指针,这一块地址是我们自己开辟的,需要malloc
  30. int** ret = (int**)malloc(depth*sizeof(int*));
  31. //columnSizes是一个指向指针的指针,这个地址已经指定了,就是说这个地址了存放的下一个地址已经确定了,但是下一个地址里存放的还是地址,这个地址任然不确定,那么就需要malloc了
  32. //*columnSizes是一个指向一个一维数组的指针,数组的大小也是depth
  33. *columnSizes = (int*)malloc(depth*sizeof(int));
  34. int front = 0, back = 0;
  35. struct TreeNode* queue[10000];
  36. queue[back++] = root;
  37. while (front < back){
  38. int start = front, end = back;
  39. (*columnSizes)[--depth] = end - start;
  40. front = end;
  41. //开始的时候我们只给了ret的地址,因为ret是一个二维数组的起始地址,但是这个二维数组里面的一维数组的地址并没有确定,就需要malloc来确定
  42. ret[depth] = (int*)malloc((end - start)*sizeof(int));
  43. for (int i=start; i<end; i++){
  44. ret[depth][i-start] = queue[i]->val;
  45. if (queue[i]->left) queue[back++] = queue[i]->left;
  46. if (queue[i]->right) queue[back++] = queue[i]->right;
  47. }
  48. }
  49. return ret;
  50. }

    c语言什么时候需要动态分配内存

首先应该知道计算机系统中有四个内存区域:

    栈:主要存放一些我们定义的局部变量和形参

    堆:主要是动态分配的存储空间

    字符常量区:存放字符常量

    全局区:存放一些全局变量和静态变量。


    int *p;//我们声明了一个指针p,p里面存放要找的值的地址

    但是光这样的话是并没有什么用的,

    int a=5;

    p=&a;//这个时候才把地址放到了p这个指针中了。但是这不叫指针的动态分配内存,这叫指针变量的初始化。

    当我们用malloc函数为一指针变量分配了地址,在不需要再用的时候需要释放这一片内存,在上面我已经讲过动态分配的变量时储存在堆里面,但是这个堆的空间并不是无限大的,也许当我们编一个小的程序的时候可能我们并不能够发现什么,但是对于那些大的程序,如果我们没及时释放堆的空间的时候会放生内存泄露。所谓内存泄露是因为堆的空间被我们动态分配用完了,这样当我们再去使用动态分配堆的空间的时候就没有足够的空间让我们使用了,这样就需要占有原来的空间,也就是会把其他的空间来储存我们键入的值,这样会导致原来储存的数据被破坏掉,导致了内存的泄露了。

    

  












    












声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/389030
推荐阅读
相关标签
  

闽ICP备14008679号