• [C]二叉树的实现——喵喵成长记


    宝子,你不点个赞吗?不评个论吗?不收个藏吗?

    最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

    喵喵喵,你对我真的很重要。

    目录

    前言

    二叉树的定义

    特殊的二叉树

    二叉树的性质(超级重要)

    代码实现

    二叉树的练习题

    总结


    前言

    二叉树用C语言实现,会加些习题进行巩固练习。那么,就让我们开始吧! 喵~


    二叉树的定义

    一棵二叉树是结点的一个有限集合,该集合:

    1. 或者为空
    2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成

    注意:

    • 二叉树不存在度大于2的结点
    • 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

    以下图片的树都是二叉树哦


    特殊的二叉树

    1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 2^k  ,则它就是满二叉树。(满二叉树
    2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

    如图所示:


    二叉树的性质(超级重要)

    1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1) 个结点.
    2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是   2^h-1 .
    3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n0   , 度为2的分支结点个数为 n2   ,则有n0=n2 +1
    4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1)(ps:是log以2为底,n+1为对数)
    5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
    • i>0i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
    • 2i+1,左孩子序号:2i+12i+1>=n否则无左孩子
    • 2i+2,右孩子序号:2i+22i+2>=n否则无右孩子

    代码实现

    1. typedef char BTDataType;
    2. typedef struct BinaryTreeNode
    3. {
    4. BTDataType _data;
    5. struct BinaryTreeNode* _left;
    6. struct BinaryTreeNode* _right;
    7. }BTNode;
    8. // 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
    9. BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi);
    10. // 二叉树销毁
    11. void BinaryTreeDestory(BTNode** root);
    12. // 二叉树节点个数
    13. int BinaryTreeSize(BTNode* root);
    14. // 二叉树叶子节点个数
    15. int BinaryTreeLeafSize(BTNode* root);
    16. // 二叉树第k层节点个数
    17. int BinaryTreeLevelKSize(BTNode* root, int k);
    18. // 二叉树查找值为x的节点
    19. BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
    20. // 二叉树前序遍历
    21. void BinaryTreePrevOrder(BTNode* root);
    22. // 二叉树中序遍历
    23. void BinaryTreeInOrder(BTNode* root);
    24. // 二叉树后序遍历
    25. void BinaryTreePostOrder(BTNode* root);
    26. // 层序遍历
    27. void BinaryTreeLevelOrder(BTNode* root);
    28. // 判断二叉树是否是完全二叉树
    29. int BinaryTreeComplete(BTNode* root);
    1. #include "BTree.h"
    2. #include "queue.h"
    3. #include "stack.h"
    4. BTNode *BinaryTreeCreate(BTDataType * src, int n, int* pi)
    5. {
    6. if (*pi >= n || src[*pi] == '#')
    7. {
    8. (*pi)++;
    9. return NULL;
    10. }
    11. BTNode * cur = (BTNode *)malloc(sizeof(BTNode));
    12. cur->_data = src[*pi];
    13. (*pi)++;
    14. cur->_left = BinaryTreeCreate(src, n, pi);
    15. cur->_right = BinaryTreeCreate(src, n, pi);
    16. return cur;
    17. }
    18. void BinaryTreePrevOrder(BTNode* root)
    19. {
    20. if (root)
    21. putchar(root->_data);
    22. BinaryTreePrevOrder(root->_left);
    23. BinaryTreePrevOrder(root->_right);
    24. }
    25. }
    26. void BinaryTreeInOrder(BTNode* root)
    27. {
    28. if (root)
    29. {
    30. BinaryTreeInOrder(root->_left);
    31. putchar(root->_data);
    32. BinaryTreeInOrder(root->_right);
    33. }
    34. }
    35. void BinaryTreePostOrder(BTNode* root)
    36. {
    37. if (root)
    38. {
    39. BinaryTreePostOrder(root->_left);
    40. BinaryTreePostOrder(root->_right);
    41. putchar(root->_data);
    42. }
    43. }
    44. void BinaryTreeDestory(BTNode** root)
    45. {
    46. if (*root)
    47. {
    48. BinaryTreeDestory(&(*root)->_left);
    49. BinaryTreeDestory(&(*root)->_right);
    50. free(*root);
    51.         *root = NULL;
    52. }
    53. }
    54. void BinaryTreeLevelOrder(BTNode* root)
    55. {
    56. Queue qu;
    57. BTNode * cur;
    58. QueueInit(&qu);
    59. QueuePush(&qu, root);
    60. while (!QueueIsEmpty(&qu))
    61. {
    62. cur = QueueTop(&qu);
    63. putchar(cur->_data);
    64. if (cur->_left)
    65. {
    66. QueuePush(&qu, cur->_left);
    67. }
    68. if (cur->_right)
    69. {
    70. QueuePush(&qu, cur->_right);
    71. }
    72. QueuePop(&qu);
    73. }
    74. QueueDestory(&qu);
    75. }
    76. int BinaryTreeComplete(BTNode* root)
    77. {
    78. Queue qu;
    79. BTNode * cur;
    80. int tag = 0;
    81. QueueInit(&qu);
    82. QueuePush(&qu, root);
    83. while (!QueueIsEmpty(&qu))
    84. {
    85. cur = QueueTop(&qu);
    86. putchar(cur->_data);
    87. if (cur->_right && !cur->_left)
    88. {
    89. return 0;
    90. }
    91. if (tag && (cur->_right || cur->_left))
    92. {
    93. return 0;
    94. }
    95. if (cur->_left)
    96. {
    97. QueuePush(&qu, cur->_left);
    98. }
    99. if (cur->_right)
    100. {
    101. QueuePush(&qu, cur->_right);
    102. }
    103. else
    104. {
    105. tag = 1;
    106. }
    107. QueuePop(&qu);
    108. }
    109. QueueDestory(&qu);
    110. return 1;
    111. }

    二叉树的练习题

    965. 单值二叉树

    简单

    197

    相关企业

    如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

    只有给定的树是单值二叉树时,才返回 true;否则返回 false

    示例 1:

    输入:[1,1,1,1,1,null,1]
    输出:true
    

    示例 2:

    输入:[2,2,2,5,2]
    输出:false
    提示
    1. 给定树的节点数范围是 [1, 100]
    2. 每个节点的值都是整数,范围为 [0, 99] 。
      1. bool isUnivalTree(struct TreeNode* root){
      2. if(!root)
      3. {
      4. return true;
      5. }
      6. if(root->left)
      7. {
      8. if(root->val!=root->left->val || !isUnivalTree(root->left))
      9. {
      10. return false;
      11. }
      12. }
      13. if(root->right)
      14. {
      15. if(root->val!=root->right->val || !isUnivalTree(root->right))
      16. {
      17. return false;
      18. }
      19. }
      20. return true;
      21. }

      100. 相同的树

      简单

      1.1K

      相关企业

      给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

      如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

      示例 1:

      输入:p = [1,2,3], q = [1,2,3]
      输出:true
      

      示例 2:

    • 输入:p = [1,2], q = [1,null,2]
      输出:false
      

      示例 3:

      输入:p = [1,2,1], q = [1,1,2]
      输出:false
      

      提示:

    1. 两棵树上的节点数目都在范围 [0, 100] 内
    • -104 <= Node.val <= 104
      1. bool isSameTree(struct TreeNode* p, struct TreeNode* q){
      2. if(p==NULL&&q==NULL)
      3. return true;
      4. else if(p==NULL||q==NULL)
      5. {
      6. return false;
      7. }
      8. else if(p->val!=q->val)
      9. {
      10. return false;
      11. }
      12. else{
      13. return isSameTree(p->left,q->left)&& isSameTree(p->right,q->right);
      14. }
      15. }

      101. 对称二叉树

      简单

      2.6K

      相关企业

      给你一个二叉树的根节点 root , 检查它是否轴对称。

      示例 1:

    1. 输入:root = [1,2,2,3,4,4,3] 输出:true

    2. 示例 2:

      输入:root = [1,2,2,null,3,null,3]
      输出:false
      

      提示:

    3. 树中节点数目在范围 [1, 1000] 内
    4. -100 <= Node.val <= 100
    1. bool check(struct TreeNode* p,struct TreeNode* q)
    2. {
    3. if(p==NULL&&q==NULL)
    4. return true;
    5. if(p==NULL||q==NULL)
    6. return false;
    7. if(p->val==q->val)
    8. return check(p->left,q->right)&&check(p->right,q->left);
    9. else
    10. return false;
    11. }
    12. bool isSymmetric(struct TreeNode* root){
    13. return check(root,root);
    14. }

    总结

    来嘛,来嘛,笑一个,今天的你也是超级赞滴,喵~


    宝子,你不点个赞吗?不评个论吗?不收个藏吗?

    最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!

    喵喵喵,你对我真的很重要。

  • 相关阅读:
    字节与字符与常见编码方式
    一文详解C++动态对象创建
    微前端框架single-spa子应用加载解析
    MAML在隐式神经表示中的应用
    毕业设计|基于51单片机的空气质量检测PM2.5粉尘检测温度设计
    SpringBoot的作用
    java八股文(mysql篇)
    jpa框架部分重点
    JVM GC算法总结
    基于springboot的疫情防控系统
  • 原文地址:https://blog.csdn.net/ormstq/article/details/133649990