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

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日

相关文章

  • Lua编程中使用嵌套循环的使用教程

    Lua编程中使用嵌套循环的使用教程 在Lua编程中,嵌套循环是一种强大的工具,可以用于处理复杂的问题。嵌套循环允许我们在循环内部再次使用循环,以便多次执行某个操作。本教程将详细介绍如何在Lua中使用嵌套循环,并提供两个示例说明。 基本语法 嵌套循环的基本语法如下: for 初始值1, 终止值1, 步长1 do — 外层循环代码 for 初始值2, 终止值2…

    other 2023年7月28日
    00
  • SignalR Self Host+MVC等多端消息推送服务(二)

    首先需要明确一下本文的主题是 SignalR Self Host+MVC 等多端消息推送服务,该主题主要包含以下内容: SignalR 框架的基本概念和实现原理 SignalR Self Host 实现消息推送 在 MVC 项目中集成 SignalR 前端页面中接收消息和发送消息 在这篇文章中,我将详细讲解以上四个部分内容,其中包含了一些相关的示例,方便大家…

    other 2023年6月27日
    00
  • thinkphp多层MVC用法分析

    ThinkPHP多层MVC用法分析 什么是多层MVC架构 多层MVC架构是指在基本的MVC(Model-View-Controller)架构基础上,增加了service层或者business层,旨在实现业务逻辑与表现逻辑的分离,并且增加了复杂业务逻辑的封装与重用。相较于传统的二层架构,多层MVC架构可以更好的优化系统架构,增强系统的可读性、可扩展性和可维护性…

    other 2023年6月27日
    00
  • javascript-webkitrequestfullscreen不是函数

    JavaScript WebKitRequestFullScreen不是函数攻略 在JavaScript中,我们可以使用requestFullScreen()方法来请求全屏显示。但是,在某些情况下,我们可能会遇到WebKitRequestFullScreen is not a function错误。在本攻略中,我们将介绍这个错误的原因,并提供一些解决方案和示…

    other 2023年5月9日
    00
  • Vue添加请求拦截器及vue-resource 拦截器使用

    当我们在Vue中使用vue-resource库进行接口请求时,我们可能需要为每个请求设置一些通用信息,比如token、请求头、请求体等,那么我们可以通过添加请求拦截器来实现这个过程。 添加请求拦截器 我们可以在Vue实例中添加一个request拦截器,这个拦截器会在每个请求发送前被触发执行,可以在这里对请求进行配置,如下: import Vue from ‘…

    other 2023年6月27日
    00
  • elementui源码学习仿写el-link示例详解

    ElementUI源码学习仿写el-link示例详解攻略 1. 了解ElementUI源码结构 ElementUI是一个基于Vue.js的组件库,其中包含了很多常用的UI组件。首先,我们需要了解ElementUI源码的结构,这有助于我们更好地理解el-link组件的实现。 ElementUI源码通常包含以下几个目录: packages:ElementUI的核…

    other 2023年6月28日
    00
  • Android中实现ProgressBar菊花旋转进度条的动画效果

    Android中实现ProgressBar菊花旋转进度条的动画效果攻略 ProgressBar是Android中常用的进度条控件之一,可以用于显示任务的进度。为了增加用户体验,我们可以为ProgressBar添加一个菊花旋转的动画效果。下面是实现这一效果的完整攻略。 步骤一:创建ProgressBar 首先,在XML布局文件中添加一个ProgressBar控…

    other 2023年9月7日
    00
  • Java ClassLoader虚拟类实现代码热替换的示例代码

    Java ClassLoader虚拟类实现代码热替换的示例代码攻略 1. 概述 Java ClassLoader是Java虚拟机(JVM)的一部分,用于加载Java类。通过自定义ClassLoader,我们可以实现类的热替换,即在运行过程中动态替换类的实现代码,而不需要重新启动应用程序。 2. 实现步骤 下面将详细介绍如何实现Java ClassLoader…

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