• 数据结构-----二叉树的基本操作


    目录

    前言

    二叉树的操作

    1.二叉树的深度

     2.二叉树的遍历

    3.二叉树的总节点统计

     4.统计叶子节点的数量

     5.统计第i层,节点的个数

    6.二叉树的查找操作

     7.交换二叉树左右子节点

     8.二叉树的复制拷贝

    9.二叉树的销毁


     

    前言

            前面学习了怎么去创建一个二叉树还有二叉树的三种遍历基本的方式,那么今天我们就接着去学习二叉树的相关操作,包括求二叉树的高度,统计二叉树节点数量,交换二叉树左右节点,查找等操作,下面就一起来看看吧。

    二叉树相关链接:

    二叉树的创建和遍历:数据结构-----二叉树的创建和遍历-CSDN博客

    二叉树的基础知识点:数据结构-----树和二叉树的定义与性质_Gretel Tade的博客-CSDN博客

    堆的相关方法代码实现:数据结构-----堆(完全二叉树)_Gretel Tade的博客-CSDN博客

    二叉树的节点如下所示: 

    1. typedef char DataType;
    2. typedef struct binarytreenode {
    3. DataType data; //数据域
    4. struct binarytreenode* left; //左指针
    5. struct binarytreenode* right; //右指针
    6. }BTnode;

    二叉树的操作

    1.二叉树的深度

    二叉树的深度是以一个节点作为单位,根节点为起始,依次往下到最底的一个叶子节点就是二叉树的深度了。 

    代码实现

    1. //计算二叉树的深度
    2. int Btree_deep(BTnode* T) {
    3. if (!T)
    4. return 0;
    5. else {
    6. int l = Btree_deep(T->left);
    7. int r = Btree_deep(T->right);
    8. if (l > r)
    9. return l + 1;
    10. else
    11. return r + 1;
    12. }
    13. }

     2.二叉树的遍历

    1. //二叉树的遍历
    2. //1.二叉树的前序遍历
    3. void Btree_prev(BTnode* T) { //T 是这个树的根节点
    4. if (!T) {
    5. return;
    6. }
    7. printf("%c ", T->data); //先输出遍历结果
    8. Btree_prev(T->left); //左边节点进入递归
    9. Btree_prev(T->right); //右边节进入递归
    10. }
    11. //2.二叉树的中序遍历
    12. void Btree_mid(BTnode* T) { //T 是这个树的根节点
    13. if (!T) {
    14. return;
    15. }
    16. Btree_prev(T->left);
    17. printf("%c ", T->data);
    18. Btree_prev(T->right);
    19. }
    20. //3.后序遍历
    21. void Btree_final(BTnode* T) { //T 是这个树的根节点
    22. if (!T) {
    23. return;
    24. }
    25. Btree_final(T->left);
    26. Btree_final(T->right);
    27. printf("%c ", T->data);
    28. }

    详细参考:数据结构-----二叉树的创建和遍历-CSDN博客

    3.二叉树的总节点统计

    获取到这个二叉树所有节点的总数 

    1. //获取二叉树的总节点个数
    2. int Btree_size(BTnode* root) {
    3. if (!root) {
    4. return 0;
    5. }
    6. return Btree_size(root->left) + Btree_size(root->right) + 1;
    7. }

     4.统计叶子节点的数量

    叶子节点是,其度为0,也就是如果这个节点的左右子节点都为空,那么这就是叶子节点

    1. //获取二叉树叶子节点个数
    2. int Btree_leaves(BTnode* root) {
    3. if (!root) {
    4. return 0;
    5. }
    6. if (root->left == NULL && root->right == NULL) {
    7. return 1;
    8. }
    9. return Btree_leaves(root->left) + Btree_leaves(root->right);
    10. }

     5.统计第i层,节点的个数

    1. //获取二叉树第i层节点个数
    2. int Btree_isize(BTnode* root, int i) {
    3. if (root==NULL)
    4. return 0;
    5. if (i == 1)
    6. return 1;
    7. return Btree_isize(root->left, i - 1) + Btree_isize(root->right, i - 1);
    8. }

    6.二叉树的查找操作

    在二叉树中查找值为k的节点,并且返回这个节点,以及说明这个节点在第几层位置

    1. //二叉树查找,值为k的节点
    2. BTnode* Btree_find(BTnode* T, DataType k,int y=1) {
    3. if (!T) {
    4. return NULL;
    5. }
    6. if (T->data == k) {
    7. printf("这个节点在第%d层\n", y);
    8. return T;
    9. }
    10. y++;
    11. //return Btree_find(T->left, k, y) != NULL ? Btree_find(T->left, k, y) : Btree_find(T->right, k, y);
    12. BTnode* node=NULL;
    13. node= Btree_find(T->left, k, y);
    14. if (node)
    15. return node;
    16. node = Btree_find(T->right, k, y);
    17. if (node)
    18. return node;
    19. else
    20. return NULL;
    21. }

     7.交换二叉树左右子节点

    给定一个二叉树,把这个二叉树的所有左右子节点都交换

    1. //交换二叉树的所有左右子节点
    2. void Btree_exchange(BTnode* T) {
    3. if (!T)
    4. return;
    5. else
    6. {
    7. BTnode* temp = T->left;
    8. T->left = T->right;
    9. T->right = temp;
    10. Btree_exchange(T->left);
    11. Btree_exchange(T->right);
    12. }
    13. }

     8.二叉树的复制拷贝

    给定一个二叉树,然后把这个二叉树拷贝到另一个空间备份,下面分两种方式进行拷贝:

    1.直接把二叉树T拷贝到 S中

    1. //直接拷贝
    2. void Btree_copy(BTnode* T,BTnode* &S) {
    3. if (!T) {
    4. S = NULL;
    5. return;
    6. }
    7. else {
    8. S = Create_node(T->data);//创建这个新树空间
    9. Btree_copy(T->left, S->left);
    10. Btree_copy(T->right, S->right);
    11. }
    12. }

     2.拷贝好二叉树,返回新树的根节点

    1. //返回拷贝好的根节点
    2. BTnode* copy(BTnode* T) {
    3. if (!T)
    4. return NULL;
    5. else
    6. {
    7. BTnode* S = Create_node(T->data);
    8. S->left = copy(T->left);
    9. S->right = copy(T->right);
    10. return S;
    11. }
    12. }

    9.二叉树的销毁

    1. //二叉树的销毁
    2. void Destory_btree(BTnode* T) {
    3. if (T) {
    4. if(T->left)
    5. Destory_btree(T->left);
    6. if(T->right)
    7. Destory_btree(T->right);
    8. free(T);
    9. T = NULL;
    10. }
    11. }

    以上就是本期的全部内容,完整的代码资源我已经上传了,需要的话可以自行下载,我们下次见咯!

    分享一张壁纸: 

  • 相关阅读:
    mysql-1:认识mysql
    Edu Codeforce133 (D、F) DP、组合数学
    mac 版hadoop3.2.4 解决 Unable to load native-hadoop library 缺失文件
    数据库选型参考
    Python基础教程之五:Python中的数据类型
    【面试题】【ES6】let和const命令 (面试必看)
    小程序开发流程
    Excel 学习笔记
    [DevOps云实践] 彻底删除AWS云资源
    sqlserver @@ROWCOUNT的使用
  • 原文地址:https://blog.csdn.net/m0_73633088/article/details/133315570