算法与数据结构(基于C语言)中的二叉树创建、遍历以及四种统计算法

多次在C站学习,现在我也终于要奉献出我的第一篇学习文章了!
这次要分享的是基于C语言的算法与数据结构中的二叉树相关知识点。
包括:

  1. 二叉树的创建与遍历
  2. 二叉树的四种统计算法

首先让我们来看初始化及创建、遍历算法

// An highlighted block
#include<stdio.h>
#include<stdlib.h>
typedef char ElementType;
typedef struct TNode *Position; /* 结构体指针 */
typedef Position BinTree; /* 二叉树类型 */
struct TNode{ /* 树结点定义 */
    ElementType Data; /* 结点数据 */
    BinTree Left;     /* 指向左子树 */
    BinTree Right;    /* 指向右子树 */
}TNode;

void CreateBinaryTree ( BinTree *T ) { /*用类似先序遍历的方法创建二叉树*/
    ElementType ch;
    scanf("%c",&ch);
    if (ch == '#')
        *T = NULL;
    else {
        *T = (BinTree)malloc(sizeof(TNode));
        (*T)->Data = ch;
        CreateBinaryTree(&((*T)->Left));
        CreateBinaryTree(&((*T)->Right));
    }
}

void PreOrderTraversal ( BinTree BT ) { /*先序遍历*/
    if ( BT ) {
        printf("%c", BT->Data);
        PreOrderTraversal( BT->Left );
        PreOrderTraversal( BT->Right );
    }
}

void InOrderTraversal ( BinTree BT ) { /*中序遍历*/
    if ( BT ) {
        InOrderTraversal( BT->Left );
        printf("%c", BT->Data);
        InOrderTraversal( BT->Right );
    }
}

void PostOrderTraversal ( BinTree BT ) { /*后序遍历*/
    if ( BT ) {
        PostOrderTraversal( BT->Left );
        PostOrderTraversal( BT->Right );
        printf("%c", BT->Data);
    }
}

接下来是四种统计方法

int GetHeight(BinTree BT){   /*统计二叉树高度*/
    int HL,HR,MaxH;
    if(BT){
        HL = GetHeight(BT->Left);
        HR = GetHeight(BT->Right);
        MaxH = HL > HR ? HL : HR;
        return (MaxH+1);
    }
    else return 0;
}

int NodeCount(BinTree BT){   /*统计(所有)结点个数*/
    int num = 0;
    if(BT == NULL) return 0;
    else if(BT->Left == NULL && BT->Right == NULL) return 1;
    else {
        num = NodeCount(BT->Left) + NodeCount(BT->Right);
        return (num+1);
    }
}

int LeafCount(BinTree BT){   /*统计叶子(最外圈结点)个数*/
    int num = 0;
    if(BT == NULL) return 0;
    else if(BT->Left == NULL && BT->Right == NULL) return 1;
    else {
        num = LeafCount(BT->Left) + LeafCount(BT->Right);
        return (num);
    }
}

int FullNodeCount(BinTree BT){
    int num;
    if(BT == NULL||(BT->Left == NULL && BT->Right == NULL)) return 0;
    else if(BT->Left == NULL && BT->Right != NULL) num = FullNodeCount(BT->Right);
    else if(BT->Left != NULL && BT->Right == NULL) num = FullNodeCount(BT->Left);
    else num = FullNodeCount(BT->Left) + FullNodeCount(BT->Right) + 1;
    return num;
}

然后是main函数

int main() {
    BinTree myTree;
    printf("Create your Binary Tree:\n");
    CreateBinaryTree(&myTree);
    printf("\n PreOrder:");
    PreOrderTraversal(myTree);
    printf("\n InOrder:");
    InOrderTraversal(myTree);
    printf("\n PostOrder:");
    PostOrderTraversal(myTree);
    printf("\n The height of this tree is: %d",GetHeight(myTree));
    printf("\n The amount of nodes on this tree is: %d",NodeCount(myTree));
    printf("\n The amount of leaves on this tree is: %d",LeafCount(myTree));
    printf("\n The amount of full nodes on this tree is: %d",FullNodeCount(myTree));
    return 0;
}

最后是输入内容来测试程序

假设我们想得到以下二叉树:
想生成的二叉树结构

那么根据先序遍历的顺序,我们应该输入内容:
FCA##DB###EH##GM###并回车
得到以下结果:
测试结果
经验证,与预期相符,程序一切正常!

假若你对输入内容有疑惑的话,建议看一下力扣出品的二叉树遍历图解

当然,也欢迎在评论区与我激情讨论!

好了,这就是本次分享的全部内容了!
若你喜欢的话请给我点个赞,这样会对我起到非常积极的作用,让我产出更多学习内容!
(对了,我也在学习 Verilog HDL(基于VIVADO),若大家感兴趣,我也可以尝试分享一些相关内容!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LWanTao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值