当前位置:   article > 正文

二叉树基本代码实现

二叉树基本代码实现

目录

1.二叉树的链式结构

2.二叉树的遍历

2.1先序遍历

2.2中序遍历

2.3后序遍历

3.二叉树的基本操作

3.1求二叉树结点个数

3.1.1全局遍历

3.1.2递归的思想分治

3.1.3局部变量

3.2求二叉树叶子结点个数

3.3求二叉树第K层结点个数

3.4求二叉树的深度/高度

3.5查找二叉树中值为x的结点

3.6二叉树的销毁

3.7运用队列实现广度优先的层序遍历


1.二叉树的链式结构

  1. typedef int BTDataType;
  2. typedef struct BinaryTreeNode
  3. {
  4. struct BinaryTreeNode* left;
  5. struct BinaryTreeNode* right;
  6. BTDataType data;
  7. }BTNode;

2.二叉树的遍历

2.1先序遍历

  1. void PrevOrder(BTNode* root)
  2. {
  3. if (root == NULL)
  4. {
  5. printf("NULL");
  6. return;
  7. }
  8. printf("%c", root->data);
  9. PrevOrder(root->left);
  10. PrevOrder(root->right);
  11. }

2.2中序遍历

  1. void InOrder(BTNode* root)
  2. {
  3. if (root == NULL)
  4. {
  5. printf("NULL");
  6. return;
  7. }
  8. InOrder(root->left);
  9. printf("%c", root->data);
  10. InOrder(root->right);
  11. }

2.3后序遍历

  1. void PostOrder(BTNode* root)
  2. {
  3. if (root == NULL)
  4. {
  5. printf("NULL");
  6. return;
  7. }
  8. PostOrder(root->left);
  9. PostOrder(root->right);
  10. printf("%c", root->data);
  11. }

3.二叉树的基本操作

3.1求二叉树结点个数

3.1.1全局遍历

  1. 1、全局
  2. int size = 0;//这里不妨思考下能不能直接放入BinaryTreeSize函数内部进行定义
  3. int BinaryTreeSize(BTNode* root)
  4. {
  5. if (root == NULL)
  6. {
  7. return;
  8. }
  9. else
  10. {
  11. ++size;
  12. }
  13. BinaryTreeSize(root->left);
  14. BinaryTreeSize(root->right);
  15. }

3.1.2递归的思想分治

用递归的思想分治,计算二叉树的结点数量,可以认为 数量 = 1 + 左子树数量 + 右子树数量,其中1是当前根结点数量

  1. int TreeSize(BTNode* root)
  2. {
  3. return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;//此处的1是自身结点
  4. }

3.1.3局部变量

  1. 2、遍历 -- 局部变量
  2. void BinaryTreeSize(BTNode* root, int* psize)
  3. {
  4. if (root == NULL)
  5. return;
  6. else
  7. ++(*psize);
  8. BinaryTreeSize(root->left, psize);
  9. BinaryTreeSize(root->right, psize);
  10. }

3.2求二叉树叶子结点个数

按照递归思想,计算二叉树的叶子结点数量,我们可以认为数量等于 = 0 + 左子树叶子结点数量 + 右子树叶子结点数量,0是因为当前根结点有子树,说明根结点不是叶子结点.

  1. //求叶子结点的个数->运用分治的思想
  2. int TreeLeafSize(BTNode* root)
  3. {
  4. //1 空 reutrn0
  5. //2叶子 return 1
  6. //非空且不是叶子 return左子树的叶子结点个数+右子树的叶子结点个数
  7. if (root == NULL)
  8. {
  9. return 0;
  10. }
  11. if (root->left == NULL && root->right == NULL)
  12. {
  13. return 1;
  14. }
  15. return TreeLeafSize(root->left) + TreeLeafSize(root->right);
  16. }

3.3求二叉树第K层结点个数

核心思路:求当前树的第k层=左子树的第k-1层+右子树的第k-1层

  1. //给的K是几就给出第K层
  2. //思路:求第K层即为求左子树的第K-1层和右子树的第K-1层
  3. int TreeKLeveLSize(BTNode* root, int k)
  4. {
  5. if (root == NULL)
  6. {
  7. return 0;
  8. }
  9. if (k == 1)
  10. return 1;
  11. return TreeKLeveLSize(root->left, k - 1) + TreeKLeveLSize(root->right, k - 1);
  12. }

3.4求二叉树的深度/高度

二叉树的高度等于1 + 左右子树高度的最大值.

  1. //二叉树的深度/高度
  2. int BinaryTreeDepth(BTNode* root)
  3. {
  4. if (root == NULL)
  5. {
  6. return 0;
  7. }
  8. int leftDepth = BinaryTreeDepth(root->left);
  9. int rightDepth = BinaryTreeDepth(root->right);
  10. return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
  11. }

3.5查找二叉树中值为x的结点

  1. /*1.root == NULL
  2. 2.root结点不是要找的,先到左树去找,左树没有再到右树去找
  3. 3.左右都没有,当前树没有找到返回NULL*/
  4. BTNode* TreeFind(BTNode* root, BTDataType x)
  5. {
  6. if (root == NULL)
  7. {
  8. return NULL;
  9. }
  10. if(root->data == x)
  11. {
  12. return root;
  13. }
  14. BTNode*lret = TreeFind(root->left, x);
  15. if (lret)
  16. {
  17. return lret;
  18. }
  19. BTNode* rret = TreeFind(root->right, x);
  20. if (rret)
  21. {
  22. return rret;
  23. }
  24. //左边右边都没有找到
  25. return NULL;
  26. }

3.6二叉树的销毁

二叉树的销毁->采用后续销毁
前中后都是递归返回顺序,处理根的顺序不一样
如果使用一级指针,存在野指针问题,调用BinaryTreeDestory的人,把指针置空
使用一级指针以保持接口的一致性

  1. void BinaryTreeDestory(BTNode* root)
  2. {
  3. if (root == NULL)
  4. {
  5. return;
  6. }
  7. BinaryTreeDestory(root->left);
  8. BinaryTreeDestory(root->right);
  9. free(root);
  10. root = NULL;
  11. }

3.7运用队列实现广度优先的层序遍历

  1. void TreeLevelOrder(BTNode* root)
  2. {
  3. Queue q;
  4. QueueInit(&q);
  5. if (root)
  6. {
  7. QueuePush(&q, root);
  8. }
  9. while (!QueueEmpty(&q))
  10. {
  11. BTNode* front = QueueFront(&q);
  12. QueuePop(&q);
  13. printf("%c", front->data);
  14. if (front->left)
  15. {
  16. QueuePush(&q, front->left);
  17. }
  18. if (front->right)
  19. {
  20. QueuePush(&q, front->right);
  21. }
  22. }
  23. QueueDestory();
  24. }

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

闽ICP备14008679号