当前位置:   article > 正文

leetcode114. 二叉树展开为链表 c语言

二叉树展开为链表 c
  1. struct TreeNode {
  2. int val;
  3. struct TreeNode *left;
  4. struct TreeNode *right;
  5. };
  6. int num; // 全局变量
  7. // 前序遍历,将节点保存在数组中
  8. void preorderTraversal(struct TreeNode* root, struct TreeNode*** res) {
  9. if (root != NULL) {
  10. num++;
  11. (*res) = (struct TreeNode**)realloc((*res), sizeof(struct TreeNode*) * num);
  12. // realloc更新申请内存的长度
  13. (*res)[num - 1] = root; // 将节点保存到数组
  14. preorderTraversal(root->left, res);
  15. preorderTraversal(root->right, res);
  16. }
  17. }
  18. void flatten(struct TreeNode* root) {
  19. num = 0;
  20. struct TreeNode** res = (struct TreeNode**)malloc(0);
  21. preorderTraversal(root, &res);
  22. for (int i = 1; i < num; i++) { // 在循环中用指针修改节点的内容
  23. struct TreeNode *prev = res[i - 1], *curr = res[i];
  24. prev->left = NULL;
  25. prev->right = curr;
  26. }
  27. free(res);
  28. }

以上方法是在先序遍历的函数前申请一个二维指针,入参为二维指针的地址。在先序遍历函数中给二维指针申请内存,内存大小是指针*节点个数。

或者另一种写法,先申请指针数组,再传入函数中保存指针。

  1. struct TreeNode * TreeArray[2000]; //结点数组
  2. int i;
  3. void nodeToArray(struct TreeNode *root) //把先序遍历的方法把结点存放到数组中
  4. {
  5. if(root == NULL)
  6. return;
  7. TreeArray[i++] = root;
  8. nodeToArray(root->left);
  9. nodeToArray(root->right);
  10. }
  11. void flatten(struct TreeNode* root){
  12. memset(TreeArray,NULL,sizeof(TreeArray)); //先将数组中的值全部赋为NULL
  13. i=0;
  14. nodeToArray(root);
  15. int j=0;
  16. while(TreeArray[j] != NULL) //将数组中的结点连接成单链表
  17. {
  18. TreeArray[j]->left = NULL;
  19. TreeArray[j]->right = TreeArray[j+1];
  20. j++;
  21. }
  22. }

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

闽ICP备14008679号