C语言实现二叉树的基本操作

我在前面的博客中讲解了链表、栈和队列,这些数据结构其实都是线性表,并且给出了详细的实现。从今天开始,我们将要来学习树,树作为一种数据结构我们经常会用到,作为起步和基础,我们先来实现二叉树,也就是每个节点有不超过2个子节点的树。对于树的操作,最基本的创建、遍历、求树高、节点数等。代码上传至 https://github.com/chenyufeng1991/BinaryTree 。

(1)节点的定义

typedef int elemType;
typedef struct BTNode{

    elemType data;
    struct BTNode *lChild;
    struct BTNode *rChild;
}BiTNode,*BiTree;

(2)二叉树的创建

//先序创建二叉树
int CreateBiTree(BiTree *T){

    elemType ch;

    scanf("%d",&ch);

    if (ch == -1) {
        T = NULL;
    }else{

        *T = (BiTree )malloc(sizeof(BiTNode));

        (*T)->data = ch;
        printf("输入%d的左子节点:",ch);
        CreateBiTree(&(*T)->lChild);
        printf("输入%d的右子节点:",ch);
        CreateBiTree(&(*T)->rChild);
    }

    return 1;
}

(3)先序遍历二叉树

//先序遍历二叉树
void PreOrderBiTree(BiTree T){

    if (T == NULL) {
        return;
    }else{

        printf("%d ",T->data);
        PreOrderBiTree(T->lChild);
        PreOrderBiTree(T->rChild);
    }
}

(4)中序遍历二叉树

//中序遍历二叉树
void MiddleOrderBiTree(BiTree T){

    if (T == NULL) {
        return;
    }else{

        MiddleOrderBiTree(T->lChild);
        printf("%d ",T->data);
        MiddleOrderBiTree(T->rChild);
    }
}

(5)后续遍历二叉树

//后续遍历二叉树
void PostOrderBiTree(BiTree T){

    if (T == NULL) {
        return;
    }else{

        PostOrderBiTree(T->lChild);
        PostOrderBiTree(T->rChild);
        printf("%d ",T->data);
    }
}

(6)二叉树的深度

//二叉树的深度
int TreeDeep(BiTree T){

    int deep = 0;
    if (T) {
        int leftdeep = TreeDeep(T->lChild);
        int rightdeep = TreeDeep(T->rChild);
        deep = leftdeep >= rightdeep?leftdeep+1:rightdeep+1;
    }

    return deep;
}

(7)叶子节点个数

//叶子节点个数
int count;
int LeafCount(BiTree T){

    if (T) {
        if (T->lChild == NULL && T->rChild == NULL) {
            count++;
        }

        LeafCount(T->lChild);
        LeafCount(T->rChild);
    }

    return count;
}

(8)测试函数

//主函数
int main(int argc,const char *argv[]){

    BiTree T;
    int depth,leafCount = 0;
    printf("请输入第一个节点的值,-1表示没有叶节点:\n");
    CreateBiTree(&T);

    printf("先序遍历二叉树:");
    PreOrderBiTree(T);
    printf("\n");

    printf("中序遍历二叉树:");
    MiddleOrderBiTree(T);
    printf("\n");

    printf("后续遍历二叉树:");
    PostOrderBiTree(T);
    printf("\n");

    depth = TreeDeep(T);
    printf("树的深度为:%d\n",depth);

    leafCount = LeafCount(T);
    printf("叶子节点个数:%d\n",leafCount);

    return 0;
}
时间: 2024-10-29 10:46:17

C语言实现二叉树的基本操作的相关文章

打印菜单界面,用c语言实现二叉树的基本操作

打印菜单界面,用c语言实现二叉树的基本操作: 其代码原理和用c++实现一样,请看本人上篇博客:二叉树的先序.中序.后序遍历等基本操作c++实现,链接:http://yaoyaolx.blog.51cto.com/10732111/1783527 实现代码: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 //定义二叉树的二叉链表结构 typedef struct Node { char data; struct N

&lt;二叉树的基本操作&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; Status CreateBiTree(Bin

《二叉树的基本操作》

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define NUM 100 //二叉树的最大结点数 6 #define QueueSize 100 //队列初始容量 7 #define TRUE 1 8 #define FALSE 0 9 #define OK 1 10 #define ERROR 0 11 #define OVERFLOW -1 12 13 typedef int

&lt;二叉树的基本操作(有层次遍历)&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define FALSE 0 #define TRUE 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struc

C语言实现二叉树-利用二叉树统计单词数目

昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以参考我的另一篇文章:http://www.cnblogs.com/landpack/p/4783120.html) Problem 我需要统计的单词是在程序直接硬编码的: 这样做得原因是省略了文件输入输出所带来的困惑: 我的每篇文章,一般只说一个主题: 这样也方便我日后复习: Solution 首先

C语言实现二叉树-02版

---恢复内容开始--- 昨天,提交完我们的二叉树项目后,今天早上项目经理早早给我打电话: 他说,小伙子干的不错.但是为什么你上面的insert是recusive的呢? 你难道不知道万一数据量大啦!那得消耗很多内存哈!: 我大吃一惊,那么项目经理果然不是吃素的,他是在提醒我别投机取巧啦: 我们都知道递归实现树是比较简单的一种方式: 的确它的性能比较差,试想每次递归都要把当前函数压栈,然后出栈.. 好啦,那咱们今天就用非递归实现它:反正今天我就不干别的啦: Problem 下面的代码你应该比较熟习

数据结构(复习)--------关于二叉树的基本操作

// // 关于数据结构的总结与复习 Coding //关于二叉树的建立以及层次,其他遍历(递归,非递归)求深度等基本操作 #include <cstdio> #include <cstdlib> //#define _OJ_ typedef struct tree { char data; struct tree *left; struct tree *right; } tree, *Bitree; typedef struct Stack1 { int top, base; B

二叉树的基本操作(含Huffman树)

大二时候写的烂代码,翻出来复习复习(o(╯□╰)o) 代码: #include <stdio.h> #include <stdlib.h> #define Max_Size 100 struct Binode{ char res; struct Binode *lchild,*rchild; }; struct Binode* First_Creat_Bitree(){//建立一棵二叉树 char ch; struct Binode *p; scanf("%c"

C语言实现二叉树

二叉树的重要性就不用多说啦: 我以前也学习过,但是一直没有总结: 网上找到的例子,要么是理论一大堆,然后是伪代码实现: 要么是复杂的代码,没有什么解释: 最终,还是靠FQ找到一些好的文章,参考地址我会在See Also部分给大家贴出来 Problem 假设我们要生成的二叉树如下图: Solution 显然,我们需要在节点保存的数据只有一个整数: struct binary_tree { int data ; // Data area //TODO }; 所以在结构体里面,我们的代码应该类似上面的