当前位置:   article > 正文

代码随想录训练营-15day:二叉树4

代码随想录训练营-15day:二叉树4

一、平衡二叉树

平衡二叉树的定义:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

使用递归方式:首先需要知道高度是什么意思,怎么获取高度。如果高度差大于1了,那么回复高度就没有意义了。

  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. int getHight(struct TreeNode* root)//得到左右子树的高度差
  10. {
  11. if(root == NULL)
  12. {
  13. return 0;
  14. }
  15. int left_len = getHight(root->left);
  16. if(left_len == -1) return -1;
  17. int right_len = getHight(root->right);
  18. if(right_len == -1) return -1;
  19. return abs(right_len - left_len) > 1? -1 : 1 + (right_len > left_len? right_len : left_len);
  20. }
  21. bool isBalanced(struct TreeNode* root) {
  22. if(root == NULL)
  23. {
  24. return true;
  25. }
  26. int len = getHight(root);
  27. return len == -1? false : true;
  28. }

二、二叉树所有路径

主要是理解递归+回溯的思路,每一次递归之后,需要回退,把路径搜索完成,遍历一个完整的路径。解答过程遇到两个方面的问题:

1 就是打印函数,sprintf使用不当,导致保存出错;之前使用的数字转字符函数和strcat,没使用成功;

2 就是c语言写法,需要传入top在里面,因此按照代码随想录的思路,先把value入栈,top在递归过程,会变化,导致元素缺失,因此需要把入栈操作放到判断左右子树的条件里面。

  1. #define ARRNUM 101
  2. void trans(struct TreeNode* curNode, char** result, int* stk, int* returnSize, int top)
  3. {
  4. //stk[top++] = curNode->val;//stack push
  5. //printf(" %d -> %d\n", top, stk[top]);
  6. // if(curNode == NULL)
  7. // return;
  8. if(curNode->left == NULL && curNode->right == NULL)
  9. {
  10. int len = 0;
  11. for(int i = 0; i < top; i++)//top is "0" index start
  12. {
  13. len += sprintf(result[(*returnSize)] + len, "%d->", stk[i]);
  14. //printf("val = %d\n",stk[i]);
  15. }
  16. //printf("top = %d\n", top);
  17. sprintf(result[(*returnSize)] + len, "%d", curNode->val);
  18. (*returnSize)++;//push到result
  19. return;
  20. }
  21. if(curNode->left)
  22. {
  23. stk[top++] = curNode->val;
  24. trans(curNode->left, result, stk, returnSize, top);
  25. --top;//value stack pop
  26. //printf("/top = %d\n", top);
  27. }
  28. if(curNode->right)
  29. {
  30. stk[top++] = curNode->val;
  31. trans(curNode->right, result, stk, returnSize, top);
  32. --top;//value stack pop
  33. //printf("//top = %d\n", top);
  34. }
  35. }
  36. char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
  37. /**定义字符数组**/
  38. char** result = (char**)malloc(sizeof(char*) * ARRNUM);//定义100个字符串
  39. for(int i = 0; i < ARRNUM; i++)
  40. {
  41. result[i] = (char*)malloc(ARRNUM);//每个字符串定义100长度
  42. }
  43. *returnSize = 0;
  44. if(root == NULL)
  45. return result;
  46. /**定义保存节点值的数组模拟栈**/
  47. int* stack = (int*)malloc(sizeof(int) * 1024);
  48. int top = 0;//栈的位置
  49. trans(root, result, stack, returnSize, top);
  50. return result;
  51. }

三、左叶子之和

重点是理解左叶子节点的含义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点(代码随想录的解释)

  1. int sumOfLeftLeaves(struct TreeNode* root){
  2. //递归出口
  3. if(root == NULL)
  4. return 0;
  5. if(root->left == NULL && root->right == NULL)//没有左y右子树, 不存在左叶子节点
  6. return 0;
  7. int leftvalue = sumOfLeftLeaves(root->left);
  8. if(root->left && root->left->left == NULL && root->left->right ==NULL)
  9. {
  10. leftvalue = root->left->val;//保存当前叶子节点的值
  11. }
  12. //右子树的左叶子节点
  13. int rightvalue = sumOfLeftLeaves(root->right);
  14. return leftvalue + rightvalue;
  15. }

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

闽ICP备14008679号