二叉树c语言的实现

二叉树的建立

  1. 二叉树的数据结构

    typedef struct node
    {
       int data;
       struct node* left;
       struct node* right;
       /* data */
    } Node;
  2. 简单创建节点

    int main() {
       Node n1;
       Node n2;
       Node n3;
       Node n4;

       n1.data = 5;
       n2.data = 6;
       n3.data = 7;
       n4.data = 8;
       //这时候节点没有连接起来   对节点进行连接
       n1.left = &n2; //n2是一个数据实体 而left需要是一个指针 取n2的地址拼到n1的左边上去
       n1.right = &n3;
       n2.left = &n4;
       n2.right = NULL; //即使没东西也要 给出NULL
       n3.left = NULL;
       n3.right = NULL;
       n4.left = NULL;
       n4.right = NULL;
       //创建成功
       //先序遍历验证
       preorder(&n1);//放入一个指针地址 作为头节点
    }
  3. 通过遍历树来确认是否是一个真正的二叉树

    //先序遍历 递归
    void preorder(Node* node){
    if(node != NULL){
    printf("%d\n",node -> data);
           preorder(node -> left);
           preorder(node -> right);
    }
    }
  4. 输出结果

  5. 中序和后续遍历

    //中序遍历 递归
    void inorder(Node* node){
    if(node != NULL){

           inorder(node -> left);
           printf("%d\n",node -> data);
           inorder(node -> right);
    }
    }
    //后序遍历 递归
    void postorder(Node* node){
    if(node != NULL){
           postorder(node -> left);
           postorder(node -> right);
           printf("%d\n",node -> data);
    }
    }
  6. 改写创建树的代码

    void createBiTree(BiTree *T)
    {
    char ch;
    scanf ("%c", &ch); //如果是字符型 %c 回车输入 算一个字符,ubutun会一直递归
    if (ch == '#')//扩展二叉树,虚结点 == 0
    {
    *T = NULL;
    }
    else
    {
    *T = (BiTree )malloc(sizeof(BiTNode)); //!!! stdlib.h 头文件一定要加!!!
    if (!*T)
    {
    exit(-1); //错误退出
    }
    (*T)->data = ch; //生成根结点
    createBiTree(&((*T)->lchild)); //构造左子树
    createBiTree(&((*T)->rchild)); //构造右子树
    }
    }
  7. 最终代码

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

    typedef char ElemType; //这里用int 作为树结点的数据

    typedef struct BiTNode
    {
    ElemType data;
    struct  BiTNode *lchild, *rchild; //左右孩子指针
    }BiTNode, *BiTree;

    void createBiTree(BiTree *T); //创建树
    void preOrderTraverse(BiTree T); //前序遍历
    void inOrderTraverse(BiTree T); //中序遍历
    void postOrderTraverse(BiTree T); //后序遍历

    int main()
    {
    BiTree T = NULL;
    createBiTree(&T);
    preOrderTraverse(T);
    printf("\n");
    inOrderTraverse(T);
    printf("\n");
    postOrderTraverse(T);
    return 0;
    }

    void createBiTree(BiTree *T)
    {
    char ch;
    scanf ("%c", &ch); //如果是字符型 %c 回车输入 算一个字符,ubutun会一直递归
    if (ch == '#')//扩展二叉树,虚结点 == 0
    {
    *T = NULL;
    }
    else
    {
    *T = (BiTree )malloc(sizeof(BiTNode)); //!!! stdlib.h 头文件一定要加!!!
    if (!*T)
    {
    exit(-1); //错误退出
    }
    (*T)->data = ch; //生成根结点
    createBiTree(&((*T)->lchild)); //构造左子树
    createBiTree(&((*T)->rchild)); //构造右子树
    }
    }

    void preOrderTraverse(BiTree T)
    {
    if (NULL == T)
    {
    return;
    }
    printf("%c", T->data); //显示结点数据,可以改成其他对结点的操作
    preOrderTraverse(T->lchild); //再先序遍历左子树
    preOrderTraverse(T->rchild); //最后先序遍历右子树
    }

    void inOrderTraverse(BiTree T)
    {
    if (NULL == T)
    {
    return;
    }
    inOrderTraverse(T->lchild); //中序遍历左子树
    printf("%c", T->data); //显示结点数据,可以改成其他对结点的操作
    inOrderTraverse(T->rchild); //最后再中序遍历右子树
    }

    void postOrderTraverse(BiTree T)
    {
    if (NULL == T)
    {
    return;
    }
    postOrderTraverse(T->lchild); //先后序遍历左子树
    postOrderTraverse(T->rchild); //再后序遍历右子树
    printf("%c", T->data); //显示结点数据,可以改成其他对结点的操作
    }
  8. 输入数据

    ABDG##H###CE#I##F##

  9. 输出数据

c语言_二叉树的建立以及3种递归的更多相关文章

  1. C语言实现二叉树的建立、遍历以及表达式的计算

    实现代码 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <ctype ...

  2. 数据结构_C语言_二叉树先序、中序、后序遍历

    # include <stdio.h> # include <stdlib.h> typedef struct BiTreeNode { char data; struct B ...

  3. C语言_指针和数组的几种访问形式

    敲几行代码来看看几种访问的形式~ #include <stdio.h>;int main() { ] = {, , , , , }; //初始化5个元素的一维数组 int *p = arr ...

  4. python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)

    #-*- coding:utf-8 -*- class Node: def __init__(self,data): self.data=data self.lchild=None self.rchi ...

  5. 一步一步写数据结构(二叉树的建立和遍历,c++)

    简述: 二叉树是十分重要的数据结构,主要用来存放数据,并且方便查找等操作,在很多地方有广泛的应用. 二叉树有很多种类,比如线索二叉树,二叉排序树,平衡二叉树等,本文写的是最基础最简单的二叉树. 思路: ...

  6. C语言二叉树的建立与遍历

    二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...

  7. 二叉树的建立与遍历(c语言)入门

    树其实在本质上就是一对多,链表就是一对一. 二叉树的建立: 这里的代码采用的是最粗暴的创建方法,无实际用处.但初次学习二叉树可以通过这个创建方法更好的理解二叉树. 二叉树的遍历: 遍历在大体上分为递归 ...

  8. 3.1 C语言_实现AVL平衡二叉树

    [序] 上节我们实现了数据结构中最简单的Vector,那么来到第三章,我们需要实现一个Set set的特点是 内部有序且有唯一元素值:同时各种操作的期望操作时间复杂度在O(n·logn): 那么标准的 ...

  9. 怎样让Oracle支持中文? 语言_地域.字符集

    暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区  作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...

随机推荐

  1. JS:||运算符

    ||逻辑运算符 ||这个符号在开发中 往往是优化的代码最常用的js符号: 当用||连接语句时,回将前后语句变为Boolean类型,再进行运算: 1.当||前面条件为false,不管后面是true/fa ...

  2. SpringBoot整合SpringSecurityOauth2实现鉴权-动态权限

    写在前面 思考:为什么需要鉴权呢? 系统开发好上线后,API接口会暴露在互联网上会存在一定的安全风险,例如:爬虫.恶意访问等.因此,我们需要对非开放API接口进行用户鉴权,鉴权通过之后再允许调用. 准 ...

  3. Canal搭建

    目录 搭建环境 MySQL环境 Canal环境 客户端 总结 需求:解决私有环境数据库的基础数据同步问题,每当中心库基础数据发生改变时,其他私有库都会增量同步 Canal主要用途是基于 MySQL 数 ...

  4. 【RPA之家转载】苏桦 华为RPA 企业财务实践:RPA与AI结合,实现百万级票据、合同处理自动化

    [RPA之家转载]苏桦 华为RPA 企业财务实践:RPA与AI结合,实现百万级票据.合同处理自动化 看到大会的主题,说每一位开发者都了不起,说白了我也非常的感触,因为我自己本身也是一个开发者,我从01 ...

  5. 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  6. 配置Apollo阿波罗.net core 3.1 c#

    直接上代码: public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(a ...

  7. CF1656E Equal Tree Sums 题解

    题目链接 思路分析 自认为是一道很好的构造题,但是我并不会做. 看了题解后有一些理解,在这里再梳理一遍巧妙的思路. 我们先来看这样的一张图: 我们发现当去掉叶子节点的父亲时,剩下树的价值和等于叶子节点 ...

  8. REST 表现层状态转化

    1.REST是什么? 1) REST:即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展 ...

  9. HashSet底层HashMap源码分析

    在看HashSet源码的时候,意外发现底层HashMap保存的value居然不是null,而是保存一个Object作为Value.顿觉有悖常理,于是来分析一下: HashSet的add方法: publ ...

  10. 74HC595驱动(并转串,fpga与时钟匹配,fpga与外部芯片的连接注意事项)

    上一次设计的动态扫描数码管显示电路模型如上,这是一个32位并行数据[31:0]disp_num选通输出并行数据[7:0]select和[7:0]段选的电路.因此需要输出16个信号 而在开发板上的电路与 ...