当前位置:   article > 正文

DAY15|| 102. 层序遍历 226. 翻转二叉树 101. 对称二叉树_inverttree(struct treenode* root)

inverttree(struct treenode* root)

102. 二叉树的层序遍历

思路:使用队列。根节点非空则入队,当队列不为空(front != rear)时,持续入队出队的操作,因为我们需要知道当层元素什么时候被遍历完,方便我们将结果存入二维数组,因此我们需要一个 lastRear 来存放第二个循环中最后一个入队的尾节点;当队头不等于 lastRear 时,重复操作:1. 队头元素出队,并访问它将其存入数组 ret;2. 把它的左右孩子入队(孩子不为空时);

  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 *returnColumnSizes array.
  12. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
  13. */
  14. struct queue {
  15. int front;
  16. int rear;
  17. struct TreeNode *t[2050];
  18. };
  19. struct TreeNode *Pop(struct queue *q){
  20. return q->t[q->front++];
  21. }
  22. void Push(struct queue *q, struct TreeNode *x){
  23. q->t[q->rear++] = x;
  24. }
  25. int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
  26. *returnSize = 0;
  27. *returnColumnSizes = (int*)malloc(sizeof(int)*2050);
  28. int **ret = (int**)malloc(sizeof(int*)*2050);
  29. struct TreeNode *p = root;
  30. if(root == NULL)
  31. return NULL;
  32. struct queue *q = malloc(sizeof(struct queue));
  33. q->front = 0;
  34. q->rear = 0;
  35. if(root != NULL)Push(q, root);
  36. while(q->front != q->rear){
  37. int i = 0;
  38. ret[*returnSize] = (int *)malloc(sizeof(int)*(q->rear -q->front));
  39. int lastRear = q->rear;
  40. while(q->front != lastRear){
  41. p = Pop(q);
  42. ret[*returnSize][i++] = p->val;
  43. if(p->left != NULL)
  44. Push(q, p->left);
  45. if(p->right != NULL)
  46. Push(q, p->right);
  47. }
  48. (*returnColumnSizes)[*returnSize] = i;
  49. (*returnSize)++;
  50. }
  51. return ret;
  52. }

这道题收获很多:学会标记每层树节点什么时候遍历完;明白了力扣二位数组的初始化;结构体中的变量不可以赋初值。 

 226. 翻转二叉树

思路:先序遍历,先交换根节点左右孩子,再交换左孩子和右孩子; 

收获:交换指针时,要传入指针地址,函数参数要用指向指针的指针! 

  1. void Swap(struct TreeNode **l, struct TreeNode **r){
  2. struct TreeNode *t = *l;
  3. *l = *r;
  4. *r = t;
  5. }
  6. struct TreeNode* invertTree(struct TreeNode* root){
  7. if(root == NULL)return root;
  8. Swap(&root->left, &root->right);
  9. // struct TreeNode *t = root->right;
  10. // root->right = root->left;
  11. // root->left = t;
  12. invertTree(root->right);
  13. invertTree(root->left);
  14. return root;
  15. }

非递归算法: 

  1. struct TreeNode* invertTree(struct TreeNode* root){
  2. if(root == NULL)return root;
  3. struct TreeNode *p = root;
  4. struct TreeNode *stack[110];
  5. int top = 0;
  6. stack[top++] = root;
  7. while(top!=0){
  8. p = stack[top-1];
  9. top--;
  10. struct TreeNode *t = p->left;
  11. p->left = p->right;
  12. p->right = t;
  13. if(p->right)
  14. stack[top++] = p->right;
  15. if(p->left)
  16. stack[top++] = p->left;
  17. }
  18. return root;
  19. }

101. 对称二叉树 

思路:分成左右两棵树来比较节点是否相等,左边的外侧与右边的外侧比,左边的内侧与右边的内侧比;但在判断节点数值是否相等前,应注意节点为空的情况;若左、右节点任意一个为空,或者都不为空但是数值不同,都是不对称;若都为空,反而是对称的情况 !!如果对称且不为空,则继续比较左边的左边的外侧与右边的右边的外侧......左边的左边的内侧与右边的右边的内侧......

  1. bool compare(struct TreeNode *left, struct TreeNode *right){
  2. if(left == NULL && right == NULL)return true;
  3. else if(left == NULL && right != NULL)return false;
  4. else if(left != NULL && right == NULL)return false;
  5. else if(left->val != right->val)return false;
  6. else
  7. {
  8. bool out = compare(left->left, right->right);
  9. bool in = compare(left->right, right->left);
  10. return in && out;
  11. }
  12. }
  13. bool isSymmetric(struct TreeNode* root){
  14. if(root == NULL)return root;
  15. return compare(root->left,root->right);
  16. }

 

 

 

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

闽ICP备14008679号