本人c语言小白一枚,近期在学习数据结构(c语言版),特写此随笔,做一些总结和分享,如有不当之处,请各位技术大牛斧正

首先我们用一个结构体来抽象树的结点,代码如下(这里我们存放的数据为char型,大家可以根据自己不同的数据来自己定义,也可以在一开始用typedf特别定义一个类型,接下来就是两个指针,

用来指向左儿子和右儿子)

struct tnode{
    char data;
    struct tnode *lchild,*rchild;
};

一,如何前序创建一颗二叉树

首先简述一下前序创建二叉树的算法:其实前序创建一颗二叉树的算法非常简单,这里我们要用到递归的思想,先给根节点赋值,然后再依次给左子树的根节点和右子树的根节点赋值,用递归的思想将整颗树赋值。(在这里我们用‘#’来表示某个结点为空),代码如下:

struct tnode * creatTree(struct tnode *head){
    char e;
    scanf("%c",&e);
    fflush(stdin);
    if(e != '#'){
         head = (struct tnode *)malloc(sizeof(struct tnode));//先开辟空间
         head ->data = e;//判断不是'#'后,给根节点赋值
         head ->lchild = NULL;
         head ->rchild = NULL;      //依次把左儿子和右儿子调用该方法进行赋值
         head ->lchild = creatTree(head->lchild);
         head ->rchild = creatTree(head->rchild);
    }
    return head;
}

这样我们就可以成功创建一颗二叉树

二,前序遍历二叉树

简述一下前序遍历二叉树的算法:(这里同样也要用到递归的思想),首先拜访头结点,然后拜访左子树,再拜访右子树,代码如下:

void preorderTree(struct tnode *head){
    //先拜访头结点
    printf("%c",head->data);
    //再走左子树
    if(head->lchild != NULL){//判断左子树是不是为空
         preorderTree(head->lchild);
    }
    if(head ->rchild !=NULL){//判断右子树是不是为空
        //再走右子树
        preorderTree(head->rchild);

    }
    return;
}

三,后序遍历二叉树:和前序遍历二叉树类似,只是我们要最后拜访根节点,同样用到了递归的思想,代码如下:

void postorderTree(struct tnode *head){
    //先左子树
    if(head->lchild != NULL){
        postorderTree(head->lchild);
    }

    //再右子树

    if(head->rchild != NULL){
        postorderTree(head->rchild);
    }
    //最后根节点
    printf("%c",head->data);
    return;
}

四,中序遍历二叉树:和前两种类似,我们先拜访左子树,再拜访根节点,最后拜访右子树,(同样用到了递归的思想)代码如下:

void inorderTree(struct tnode *head){
    //先走头结点
    printf("%c",head->data);

    //再走左子树
    if(head->lchild !=NULL){
        inorderTree(head->lchild);
    }
     //再走右子树
    if(head->rchild != NULL){
        inorderTree(head->rchild);
    }

    return;
}

五,输出节点的个数

思路:我们先在main函数里面定义一个计数器,在遍历的过程中,只要节点不是null,我们就让这个计数器++,这样就可以实现记录节点个数的功能啦,(在这里我们同样又用到了递归的思想,递归真的好重要的,到处都是递归),代码如下:(这里特别要注意的地方就是我们在main函数里面定义的计数器,一定要把地址给我们的函数,所以我们函数里面的形参是个int型的指针)

int sumNode(struct tnode *head,int *count){
    if(head == NULL){//判断根节点是否为空
        ;
    }else{
        //在这里我们用的是前序遍历二叉树的思想,先走根节点,在走左右子树
        *count += ;
        sumNode(head->lchild,count);
        sumNode(head->rchild,count);
    }
    return *count;
}

六,输出叶子节点的个数

简单思路:其实这个和上面输出节点的思路差不多,只不过我们要加一个判断条件,就是判断该结点是否为叶子节点,判断条件也很简单,只要看它的左右子树是否为空就好了,(同样也是用到了递归的思路)代码如下:

int numberLeafNode(struct tnode *head,int *countln){
    if(head->lchild == NULL&&head->rchild == NULL){//判断是否为叶子节点
        ;
    }else{//如果不是叶子节点的话,就去看它的左右子树是不是叶子节点
        if(head->lchild != NULL){
            numberLeafNode(head->lchild,countln);
        }
        if(head->rchild != NULL){
            numberLeafNode(head->rchild,countln);
        }
    }
}

以上就是全部内容,如有疑问和您的宝贵建议,尽情可以在评论中留言

用c语言实现前序创建二叉树(递归),分别用前序,中序,后序遍历,以及分别输出节点个数和叶子节点个数的更多相关文章

  1. c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  2. 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

    接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...

  3. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

  5. 前序+中序->后序 中序+后序->前序

    前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...

  6. SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  7. 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)

    原文:在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  8. SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度

    数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...

  9. 【11】-java递归和非递归二叉树前序中序后序遍历

    二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...

随机推荐

  1. python process

    原文:https://www.cnblogs.com/LY-C/p/9145729.html 使用process模块可以创建进程 from multiprocessing import Process ...

  2. Winows 2008远程桌面访问多用户设置

    一张图

  3. 你不知道的 IDEA Debug调试小技巧

    一.多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的,就像下面这张图,平时我们都使用的是默认的 ALL(在Eclipse中默认是线程模式) ,这种模式我们只能将一个 ...

  4. Egret资源跨域问题

    在服务器上配置了允许跨域还不够,还需要在引擎配置允许跨域,不然texture无法在webgl上下文中渲染 会报一个类似于The cross-origin image at 的错误, 只需要在egret ...

  5. 04-04 AdaBoost算法代码(鸢尾花分类)

    目录 AdaBoost算法代码(鸢尾花分类) 一.导入模块 二.导入数据 三.构造决策边界 四.训练模型 4.1 训练模型(n_e=10, l_r=0.8) 4.2 可视化 4.3 训练模型(n_es ...

  6. Python3程序设计指南:01 过程型程序设计快速入门

    大家好,从本文开始将逐渐更新Python教程指南系列,为什么叫指南呢?因为本系列是参考<Python3程序设计指南>,也是作者的学习笔记,希望与读者共同学习. .py文件中的每个估计都是顺 ...

  7. Spring源码分析之IOC的三种常见用法及源码实现(一)

    1.ioc核心功能bean的配置与获取api 有以下四种 (来自精通spring4.x的p175) 常用的是前三种 第一种方式 <?xml version="1.0" enc ...

  8. 代码审计-MetInfo CMS任意文件读取漏洞

    0x01 代码分析 发现在app\system\include\module\old_thumb.class.php疑似有任意文件读取漏洞 public function doshow(){ glob ...

  9. Bzoj 4806 炮 (dp)

    题目描述 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子".  炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘 ...

  10. [POI2015]PIE

    题目描述 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色.你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要满足以下要求:( ...