详细了解C语言二叉树的建立与遍历

这篇文章主要介绍了C中二叉树的建立和各种遍历实例代码,涉及树节点的定义,后序遍历,层序遍历,深度优先和广度优先等相关内容,具有一定借鉴价值,需要的朋友可以参考下

详细了解C语言二叉树的建立与遍历,久久派带你了解更多相关信息。

目录
  • 这里给一个样例树:
  • 总结

这里给一个样例树:

详细了解C语言二叉树的建立与遍历

代码:

#include <stdio.h> #include <string.h>#include <stdlib.h>/*    二叉树的二叉链表结点结构定义     */typedef struct BiTNode{    char data;    struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree T=NULL;/*    先序遍历建立一个二叉树    */void Create (BiTree *T)       //    二级指针改变地址的地址{    char ch;    scanf(\"%c\",&ch);    if(ch==\'#\')        *T=NULL;    else    {        *T=(BiTree)malloc(sizeof(BiTNode));        if(!*T)            return ;        else        {            (*T)->data=ch;            Create(&(*T)->lchild);            Create(&(*T)->rchild);        }    }}/*    二叉树的前序递归遍历算法    */void PreOrderTraverse(BiTree T){    if(T==NULL)        return ;    printf(\"%c \",T->data);    PreOrderTraverse(T->lchild);    PreOrderTraverse(T->rchild);}/*    二叉树的中序递归遍历算法    */void InOrderTraverse(BiTree T){    if(T==NULL)        return ;    InOrderTraverse(T->lchild);    printf(\"%c \",T->data);    InOrderTraverse(T->rchild);}/*    二叉树的后序递归遍历算法    */void PostOrderTraverse(BiTree T){    if(T==NULL)        return ;    PostOrderTraverse(T->lchild);    PostOrderTraverse(T->rchild);    printf(\"%c \",T->data);}int main(){    printf(\"请按先序遍历的结果输入树,例如:ABDH#K###E##CFI###G#J##\\n\");    Create(&T);    printf(\"先序遍历的结果为:\\n\");    PreOrderTraverse(T);    printf(\"\\n\");    printf(\"中序遍历的结果为:\\n\");    InOrderTraverse(T);    printf(\"\\n\");    printf(\"后序遍历的结果为:\\n\");    PostOrderTraverse(T);    printf(\"\\n\");    return 0;}

输出结果如下

详细了解C语言二叉树的建立与遍历

PS:下面是一个用C++里面的取引用代替了二级指针

#include<bits/stdc++.h>using namespace std;/*    二叉树的二叉链表结点结构定义     */typedef struct BiTNode{    char data;    struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree T=NULL;/*    先序遍历建立一个二叉树    */void Create (BiTree &T)        //    C++取引用{    char ch;    scanf(\"%c\",&ch);    if(ch==\'#\')        T=NULL;    else    {        T=(BiTree)malloc(sizeof(BiTNode));        if(!T)            return ;        else        {            T->data=ch;            Create(T->lchild);            Create(T->rchild);        }    }}/*    二叉树的前序递归遍历算法    */void PreOrderTraverse(BiTree T){    if(T==NULL)        return ;    printf(\"%c \",T->data);    PreOrderTraverse(T->lchild);    PreOrderTraverse(T->rchild);}/*    二叉树的中序递归遍历算法    */void InOrderTraverse(BiTree T){    if(T==NULL)        return ;    InOrderTraverse(T->lchild);    printf(\"%c \",T->data);    InOrderTraverse(T->rchild);}/*    二叉树的后序递归遍历算法    */void PostOrderTraverse(BiTree T){    if(T==NULL)        return ;    PostOrderTraverse(T->lchild);    PostOrderTraverse(T->rchild);    printf(\"%c \",T->data);}int main(){    printf(\"请按先序遍历的结果输入树,例如:ABDH#K###E##CFI###G#J##\\n\");    Create(T);    printf(\"先序遍历的结果为:\\n\");    PreOrderTraverse(T);    printf(\"\\n\");    printf(\"中序遍历的结果为:\\n\");    InOrderTraverse(T);    printf(\"\\n\");    printf(\"后序遍历的结果为:\\n\");    PostOrderTraverse(T);    printf(\"\\n\");    return 0;}

PS:遍历的PLus版,想要的自取。

#include <iostream>#include <queue>#include <stack>#include <cstdio>#include <cstdlib>using namespace std;const int cmax=1e2+5;typedef struct BiTNode {	char data;	struct BiTNode *lchild ,*rchild;}BiTNode,*BiTree;void CreateBiTree (BiTree &T){	char ch;	scanf(\"%c\",&ch);	if(ch==\'#\')	T=NULL;	else	{		T=(BiTNode *)malloc(sizeof(BiTNode));		T->data=ch;		CreateBiTree(T->lchild);		CreateBiTree(T->rchild);	}	return ; }void PreOrder(BiTree T){	if(T)	{		printf(\"%c\",T->data);		PreOrder(T->lchild);		PreOrder(T->rchild);	}}void InOrder(BiTree T){	if(T)	{		InOrder(T->lchild);		printf(\"%c\",T->data);		InOrder(T->rchild);	}}void PostOrder(BiTree T){	if(T)	{		PostOrder(T->lchild);		PostOrder(T->rchild);		printf(\"%c\",T->data);	}}//   非递归中序遍历 void InOrderTraverse(BiTree T) {	stack<BiTree> S;	BiTree p;	S.push(T);	while(!S.empty())	{		p=new BiTNode;		while((p=S.top())&&p)		    S.push(p->lchild);		S.pop();		if(!S.empty())		{			p=S.top();			S.pop();			cout<<p->data<<\"  \";			S.push(p->rchild); 		 } 	 } }//    先序非递归遍历void PreOrder_Nonrecursive(BiTree T){	stack<BiTree> S;	BiTree p;	S.push(T);	while(!S.empty())	{		while((p=S.top())&&p)		{			cout<<p->data<<\"  \";			S.push(p->lchild); 		 } 		S.pop();		if(!S.empty())		{			p=S.top();			S.pop();			S.push(p->rchild);		 } 	} }  int visit(BiTree T) { 	if(T) 	{ 		printf(\"%c \",T->data); 		return 1;	 }	else	return 0; } //    非递归层次遍历 void  LeverTraverse(BiTree T) { 	queue <BiTree> Q; 	BiTree p; 	p=T; 	if(visit(p)==1) 	    Q.push(p); 	while(!Q.empty()) 	{ 		p=Q.front(); 		Q.pop(); 		if(visit(p->lchild)==1) 		    Q.push(p->lchild); 		if(visit(p->rchild)==1) 		    Q.push(p->rchild);	 } }//主函数int main(){	BiTree T;	char j;	int flag=1;	printf(\"本程序实现二叉树的操作。\\n\");    printf(\"叶子结点以#表示。\\n\");    printf(\"可以进行建立二叉树,递归先序、中序、后序遍历,非递归先序、中序遍历及非递归层序遍历等操作。\\n\");    printf(\"请建立二叉树。\\n\");    printf(\"建树将以三个空格后回车结束。\\n\");    printf(\"例如:1 2 3 4 5 6       (回车)\\n\\n\");	CreateBiTree(T);           //初始化队列    getchar();    printf(\"\\n\");    printf(\"请选择: \\n\");    printf(\"1.递归先序遍历\\n\");    printf(\"2.递归中序遍历\\n\");    printf(\"3.递归后序遍历\\n\");    printf(\"4.非递归中序遍历\\n\");    printf(\"5.非递归先序遍历\\n\");    printf(\"6.非递归层序遍历\\n\");    printf(\"0.退出程序\\n\");    while(flag)    {        scanf(\" %c\",&j);        switch(j)        {            case \'1\':if(T)            {                printf(\"递归先序遍历二叉树:\");                PreOrder(T);                printf(\"\\n\");            }            else printf(\"二叉树为空!\\n\");            break;            case \'2\':if(T)            {                printf(\"递归中序遍历二叉树:\");                InOrder(T);                printf(\"\\n\");            }            else printf(\"二叉树为空!\\n\");            break;            case \'3\':if(T)            {                printf(\"递归后序遍历二叉树:\");                PostOrder(T);                printf(\"\\n\");            }            else printf(\"二叉树为空!\\n\");            break;            case \'4\':if(T)            {                printf(\"非递归中序遍历二叉树:\");                InOrderTraverse(T);                printf(\"\\n\");            }            else printf(\"二叉树为空!\\n\");            break;            case \'5\':if(T)            {                printf(\"非递归先序遍历二叉树:\");                PreOrder_Nonrecursive(T);                printf(\"\\n\");            }            else printf(\"二叉树为空!\\n\");            break;            case \'6\':if(T)            {                printf(\"非递归层序遍历二叉树:\");                LeverTraverse(T);                printf(\"\\n\");            }            else printf(\"二叉树为空!\\n\");            break;            default:flag=0;printf(\"程序运行结束,按任意键退出!\\n\");        }    }}

详细了解C语言二叉树的建立与遍历

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注趣讯吧的更多内容!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 5579166@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/8635.html

(0)
上一篇 2021-07-30 23:24:07
下一篇 2021-07-30 23:24:10

相关推荐

  • 初次配隐形眼镜多少钱(隐形眼镜多少)

    如果我有仙女棒,能赐我一个「任意」的愿望:我的心愿…不是变大变小变漂亮…不是世界和平,而是——求仙女棒还我一双不近视的眼睛!当然,小编知道,没有仙女也没有仙女棒。(实名sad)那对于需要购买隐形眼镜的集美们来说,都想知道隐形眼镜多少钱的可以不…

    2022-01-15
    910
  • 怎么提升芝麻信用分(我芝麻分565居然开通借呗了)

    怎么提升芝麻信用分?我芝麻分565居然开通借呗了,久久派带你了解相关信息。芝麻分是个人信用的综合评估,不是积分,并不会持续上涨。它是通过大数据与人工智能计算出的一个综合履约概率得分。刚开通芝麻时,随着你的五维数据不断完善,分数会逐渐上涨。一段时间后因为五维数据已经比较稳定,所以芝麻分也会趋于稳定或在小范围波动。这就好比你认识很多年的朋友,他平时的行事风格、性格是怎样的,你已经很清楚了,如

    2021-11-03
    960
  • 赵薇被谁白瞟了4年(日子过得怎么样?)

    赵薇被谁白瞟了4年日子过得怎么样?!在腾讯视频被网友发现将赵薇的名字从作品中除名后,有网友在另一个视频平台爱奇艺搜索赵薇的名字,竟然提示“没有搜索到相关结果,还称由于相关法律法规和政策,部分结果未予显示”

    2021-09-21 用户投稿
    2280
  • 卡萨帝冰箱返修率高吗(海尔卡萨帝冰箱怎么样)

    由于给冰箱冷冻效果做测评,冻肉、冻鱼需要冷冻的周期更长,这次我就主要先给大家说一下冷藏的情况。宝骏31质量怎么样(宝骏31二手车报价一万左右)说起小型车,天天拍车脑海里首先想到的就是大众Polo。这款车在前段时间热播的《欢乐颂2》里曝光度实在太高,是白富美曲筱绡的专属座驾。在现实生活中,这款车也是数…

    2021-12-19
    1380
  • 高频交易是什么意思(什么是高频交易)

    1、什么是高频交易?高频交易是一种技术,涉及专门的软件和算法,高端计算机,低延迟的互联网访问和最新的市场数据,以超越所有竞争并允许采用其他方法无法实现的独特策略。高频交易(HFT)是一种系统,其中算法和软件每秒进行多次交易,并且提供了很多常规交易者

    2022-01-06
    500
  • 团队奖励方案怎么写范文(奖励作为团队团建)

    在大多数企业中都存在发放年终奖金的习惯,然而年终奖金的发放需要考虑哪些因素?什么样的发放方案更为合理?这是我们需要考虑的问题。通过实践的积累,我们认为:在设计年终奖金分配方案的时候,应该综合考虑组织、

    2021-12-14 用户投稿
    530

发表评论

登录后才能评论