c语言版本二叉树基本操作示例(先序 递归 非递归)

yizhihongxing

C语言版本二叉树基本操作示例(先序 递归 非递归)

二叉树是一种重要的数据结构,用于组织和存储数据。C语言是一种常用的编程语言,具有许多优秀的二叉树操作库。本文将介绍C语言版本二叉树的基本操作示例,包括先序遍历的递归和非递归实现。

先序遍历的递归实现

先序遍历是指从根节点开始遍历,先输出根节点,然后递归遍历左子树和右子树。该算法可以简单地通过递归函数来实现。

#include <stdio.h>
#include <stdlib.h>

//定义二叉树节点
typedef struct TreeNode{
    int data;   //节点数据
    struct TreeNode* left;  //左子树
    struct TreeNode* right; //右子树
}TreeNode,*BinTree;

//构建二叉树
BinTree CreateBinTree(){
    BinTree root = NULL;
    int data;
    scanf("%d", &data);

    if(data == -1){ //递归结束
        return NULL;
    }

    root = (BinTree)malloc(sizeof(TreeNode));
    root->data = data;          //根节点
    root->left = CreateBinTree();//左子树
    root->right = CreateBinTree();//右子树

    return root;
}

//先序遍历的递归实现
void PreOrder(BinTree root){
    if(root == NULL){
        return;
    }

    printf("%d ",root->data);   //输出根节点
    PreOrder(root->left);       //遍历左子树
    PreOrder(root->right);      //遍历右子树
}

//主函数
int main(){
    BinTree root = NULL;

    printf("请输入二叉树节点:\n");
    root = CreateBinTree();

    printf("先序遍历的递归结果:\n");
    PreOrder(root);   

    return 0;
}

示例输入:

请输入二叉树节点:
1
2
-1
-1
3
-1
-1

示例输出:

先序遍历的递归结果:
1 2 3

先序遍历的非递归实现

非递归实现先序遍历就是利用栈先进后出的特性,完成遍历。该算法与递归算法相比,不需要额外的函数调用开销,因此效率更高。

#include <stdio.h>
#include <stdlib.h>

//定义二叉树节点
typedef struct TreeNode{
    int data;   //节点数据
    struct TreeNode* left;  //左子树
    struct TreeNode* right; //右子树
}TreeNode,*BinTree;

int stack_size = 100;    //栈的大小
int top = -1;            //栈指针

//构建二叉树
BinTree CreateBinTree(){
    BinTree root = NULL;
    int data;
    scanf("%d", &data);

    if(data == -1){ //递归结束
        return NULL;
    }

    root = (BinTree)malloc(sizeof(TreeNode));
    root->data = data;          //根节点
    root->left = CreateBinTree();//左子树
    root->right = CreateBinTree();//右子树

    return root;
}

//先序遍历的非递归实现
void PreOrder(BinTree root)
{
    BinTree stack[stack_size]; //定义栈
    while(root != NULL || top != -1){ //循环条件
        while(root != NULL){  //往左子树寻找,直到没有左子树
            printf("%d ",root->data);//输出根节点
            stack[++top] = root;     //在栈中保存该节点
            root = root->left;       //遍历左子树
        }
        if(top != -1){          //如果栈不空
            root = stack[top--]; //出栈
            root = root->right;  //遍历右子树
        }
    }
}

//主函数
int main(){
    BinTree root = NULL;

    printf("请输入二叉树节点:\n");
    root = CreateBinTree();

    printf("先序遍历的非递归结果:\n");
    PreOrder(root);   

    return 0;
}

示例输入:

请输入二叉树节点:
1
2
-1
-1
3
-1
-1

示例输出:

先序遍历的非递归结果:
1 2 3

本文介绍了C语言版本二叉树的基本操作示例,包括先序遍历的递归和非递归实现。无论是递归还是非递归实现,都是二叉树基本操作中必不可少的部分,希望本文能够对读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言版本二叉树基本操作示例(先序 递归 非递归) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java 基础语法之解析 Java 的包和继承

    Java 基础语法之解析 Java 的包和继承 Java 作为面向对象编程的语言,对于代码的组织和扩展提供了很好的支持。其中包和继承作为两个重要的概念,是 Java 中的核心特性之一。本文将从概念入手,详细讲解 Java 中的包和继承的原理和使用方法。 Java 包的概念和使用 Java 中的包可以看作是一种类的组织方式,类似于文件夹的概念。通常情况下,我们…

    other 2023年6月27日
    00
  • Android UI实时预览和编写的各种技巧

    Android UI实时预览和编写的各种技巧攻略 在Android开发中,实时预览和编写UI是提高开发效率的重要环节。本攻略将介绍一些技巧,帮助您更好地进行Android UI的实时预览和编写。 1. 使用Android Studio的布局编辑器 Android Studio提供了强大的布局编辑器,可以实时预览UI的效果。以下是一些使用布局编辑器的技巧: 使…

    other 2023年8月25日
    00
  • Python+Requests+PyTest+Excel+Allure 接口自动化测试实战

    Python+Requests+PyTest+Excel+Allure 接口自动化测试实战 本攻略将详细介绍如何使用Python的Requests库、PyTest测试框架、Excel作为测试数据源以及Allure生成漂亮的测试报告进行接口自动化测试。 准备工作 安装Python:确保您的系统已经安装了Python,并配置好了环境变量。 安装依赖库:使用pip…

    other 2023年10月17日
    00
  • 一步一步跟我学易语言之自定义数据类型

    一步一步跟我学易语言之自定义数据类型 自定义数据类型是基于现有的数据类型创建的一种新的数据类型,它能够更好地满足业务需求。下面将介绍如何在易语言中创建自定义数据类型。 步骤1:声明结构体 结构体是存储复杂数据类型的一种方式,它由多个变量组成,并且这些变量的类型可以不同。声明结构体的语法如下: 类型 结构体名 { 类型1 变量1; 类型2 变量2; … 类…

    other 2023年6月25日
    00
  • 「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块

    「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块 一、介绍 本篇文章将介绍如何使用Arduino控制RGB全彩LED模块。RGB全彩LED模块是一种能够输出红、绿、蓝三种颜色的LED模块,通过组合三种颜色可以输出各种颜色的光线。本篇文章将会介绍如何控制RGB全彩LED模块的颜色,并在实际环境中进行实验演示。 二、材料 Arduino UNO…

    其他 2023年3月28日
    00
  • linux命令学习之shift命令

    以下是Linux命令学习之shift命令的完整攻略,包括基本介绍、使用方法、注意事项和示例说明等内容。 1. 基本介绍 shift命令是Linux中的一个内置命令,用于移动令行参数。它可以将命令行参数向左移动一个位置,即将$2$号参数移动到$1$号参数的位置,将3$号参数移动到$2$号参数的位置,以此类推。shift命令通常用于处理命令行参数。 2. 使用方…

    other 2023年5月10日
    00
  • 浅谈pycharm使用及设置方法

    浅谈PyCharm使用及设置方法 PyCharm是一款非常流行的Python集成开发环境,拥有强大、智能的代码编辑、调试、测试和优化功能,可以大大提高Python程序开发效率。本文将介绍PyCharm的基本使用及设置方法。 安装和环境配置 在官网(https://www.jetbrains.com/pycharm/)下载相应版本的PyCharm,并安装到指定…

    other 2023年6月26日
    00
  • iOS10.0.2升级需要多大空间 更新升级iOS 10.0.2正式版需要占用多大内存

    升级iOS 10.0.2需要的空间取决于您的设备型号和当前运行的操作系统版本。一般来说,iOS 10.0.2的升级文件大小约为200-300 MB。然而,为了成功完成升级,您需要更多的可用存储空间。 以下是升级iOS 10.0.2的完整攻略: 检查可用存储空间:在升级之前,您应该检查设备上的可用存储空间。打开设置应用程序,然后转到“通用”>“存储空间与…

    other 2023年8月1日
    00
合作推广
合作推广
分享本页
返回顶部