采用孩子兄弟表示法建立一棵树。

说明:因为孩子兄弟表示法的特点,不好用递归创建,所以利用队列来存放结构体。
注意:当指针作为函数参数时,不能改变实参指针的指向,只能改变实参指针所指向的数据

#include<stdio.h>
#include<malloc.h>#define DateType char
#define MAXSIZE 100   //队列的最大容量//typedef struct CSNode
{DateType data;struct CSNode *firdtchild;//第一个孩子struct CSNode *nextsbling;//该孩子的第一个兄弟
}CSNode,*CSTree;
typedef struct SeqQueue
{CSTree data[MAXSIZE];//结构体数组int front,rear;//数组下标
}SeqQueue, *PSeqQueue;PSeqQueue  Init_SeqQueue()//队列初始化
{PSeqQueue Q;Q= (PSeqQueue)malloc(sizeof(SeqQueue));if (Q){Q->front = 0;Q->rear = 0;}return Q;
}int  Empty_SeqQueue(PSeqQueue Q)//返回值:1表示为空,0表示非空//
{if (Q && Q->front == Q->rear)return (1);elsereturn (0);
}int   In_SeqQueue(PSeqQueue Q, CSTree  x)//返回值:1表示成功,-1表示队满溢出//
{    if ((Q->rear + 1) % MAXSIZE == Q->front){printf("队满");return -1;    /*队满不能入队*/}else{Q->rear = (Q->rear + 1) % MAXSIZE;Q->data[Q->rear] = x;return 1;    /*入队完成*/}
}
CSTree Out_SeqQueue(PSeqQueue Q)//出队,返回指针 //
{CSTree x;x=(CSTree)malloc(sizeof(CSNode));if (Empty_SeqQueue(Q)) {printf("队空");return -1;    /*队空不能出队*/}else{Q->front = (Q->front + 1) % MAXSIZE;x= Q->data[Q->front];return x;    /*出队完成*/}
}
CSTree CreateTree()  //创建一棵树
{CSTree T;T= (CSTree)malloc(sizeof(CSNode));PSeqQueue Q;Q= Init_SeqQueue();//构造一个空队列char buffChild[20] = { '\0' };  //用于存放孩子们的缓存printf("请输入树的根结点(字符,以#代表空):\n");scanf("%c", &buffChild[0]);if (buffChild[0] != '#'){T->data = buffChild[0];T->nextsbling = NULL;  //根结点无兄弟In_SeqQueue(Q, T);  //根结点入队while (!Empty_SeqQueue(Q)){CSTree e;e = Out_SeqQueue(Q);printf("请按长幼顺序输入结点%c的孩子(输入的字符串以#结束):\n", e->data);scanf("%s", buffChild);if (buffChild[0] != '#')//有孩子{CSTree q,p;q =p= (CSTree)malloc(sizeof(CSNode));  //开辟孩子结点空间if (!q)return 0;q->data = buffChild[0];  //e->firdtchild = q;  //指向第一个孩子In_SeqQueue(Q, q);  //第一个孩子入队p = q;  //指向刚入队的孩子for (size_t i = 1; i < strlen(buffChild) - 1; ++i) //孩子存在兄弟{q = (CSTree)malloc(sizeof(CSNode));  //开辟孩子结点空间if (!q)return 0;q->data = buffChild[i];p->nextsbling = q;In_SeqQueue(Q, q);p = q;                     //指向刚入队的孩子}p->nextsbling = NULL;}else//无孩子{e->firdtchild = NULL;}}}else{T = NULL;//空树}return T;
}int LevelOrderTraverse( CSTree T)
{//层序遍历树PSeqQueue Q;Q = Init_SeqQueue();//构造一个空队列if (T){printf("%c ", T->data);     //访问结点In_SeqQueue(Q, T);             //根结点排队while (!Empty_SeqQueue(Q)){CSTree e, p;e = p = (CSTree)malloc(sizeof(CSNode));e = Out_SeqQueue(Q);p = e->firdtchild;while (p){printf("%c ", p->data);In_SeqQueue(Q, p);p = p->nextsbling;}}return 1;}return 0;
}void PreOrder(CSTree T)//前序遍历
{if (T){printf("%c", T->data);PreOrder(T->firdtchild);PreOrder(T->nextsbling);}
}int main()
{CSTree T;T = CreateTree();printf("按层序遍历该树:");LevelOrderTraverse(T);printf("\n");printf("进行前序遍历:\n");PreOrder(T);printf("\n");system("pause");return 0;
}

采用孩子兄弟表示法建立一棵树相关推荐

  1. 设树采用孩子兄弟表示法存放.用类c语言设计算法计算树的高度.,(数据结构课程设计分类题目.doc...

    (数据结构课程设计分类题目 线性表 顺序表: 1.设有一元素为整数的线性表L=(a1,a2,a3,-,an),存放在一维数组A[N]中,设计一个算法,以表中an作为参考元素,将该表分为左.右两部分,其 ...

  2. c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树

    1.树:n个结点的有限集,n=0时为空树. 1)特点: (1)有且仅有一个特定的称为根的结点. (2)有若干个互不相交的子树,这些子树本身也是一棵树. (3)树的根结点没有前驱结点,除根结点外的所有结 ...

  3. c语言孩子兄弟法存储一棵树,树的孩子兄弟表示法

    前面讲解了存储普通树的双亲表示法和孩子表示法,本节来讲解最后一种常用方法--孩子兄弟表示法. 图 1 普通树示意图 树结构中,位于同一层的节点之间互为兄弟节点.例如,图 1 的普通树中,节点 A.B ...

  4. 假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示。假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下:

    假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示.假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下: typedef st ...

  5. 双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法),森林和二叉树的转换

    树的存储结构 一.双亲表示法 二.孩子表示法(孩子链表) 三.孩子兄弟表示法(二叉树表示法.二叉链表表示法) 四.森林(树)和二叉树的转换 一.双亲表示法 实现:定义数组结构存放树的结点,每个结点含两 ...

  6. 树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)

    文章目录 一. 树的概念 二. 树的存储结构 (一). 双亲表示法 (二). 孩子表示法 1. 定长结点链表存储结构 2. 孩子链表存储结构 (三). 孩子兄弟表示法 一. 树的概念 树(Tree)是 ...

  7. 编程求以孩子兄弟表示法存储的森林的叶子结点数☆

    题目:编程求以孩子兄弟表示法存储的森林的叶子结点数 分析:我们可以试想一个节点它如果有左孩子,那么根据孩子兄弟表示法的规则,那它一定不是叶节点,相反如果没有左孩子,那么             它一定 ...

  8. 孩子表示法 双亲表示法 孩子兄弟表示法

    今天复习书的存储结构中的表示法 分别是   双亲表示法  孩子表示法 孩子兄弟表示法 如果现在是这种数据关系; 双亲表示法: 孩子表示法: 孩子兄弟表示法: 感觉最重要的逻辑关系一看图就知道了,关键在 ...

  9. 【数据结构】求以孩子兄弟表示法存储的森林的叶子结点数,树高

    1.求叶子结点数 T的第一个孩子存在T->firstChild里,所以如果T连第一个孩子都没有,那肯定为叶子结点,也就是说T->firstChild==NULL. 所以说,以孩子兄弟表示法 ...

最新文章

  1. python 第一行 报错_初学Python-只需4步,爬取网站图片
  2. c语言 存储,c语言存储类
  3. 谁说国产编译器没救了?这个 C/C++ 和 JavaScript 编译器来了 | 程序人生 2020
  4. pd怎么转成mysql_powerdesigner中实现PDM到MYSQl数据库的转换《转》
  5. python基础6-控制语句
  6. leetcode大纲
  7. consul docker register
  8. php error file_get_contents()
  9. JS获取URL传过来的参数
  10. wait放弃对象锁_Java线程:notify()和wait()示例
  11. 使用FudanNLP实现依存句法分析
  12. phpstudy php redis,phpstudy拓展redis
  13. excel如何制作图表
  14. Windows文件系统-NTFS文件系统
  15. 数据库设计-多级栏目(标题)分类设计
  16. OSChina 周二乱弹 —— 好朋友都脱单了 而我就比较厉害了
  17. qt程序报错error C2248: “ThreadTest::ThreadTest”: 无法访问 private 成员(在“ThreadTest”类中声明)
  18. 低版本浏览器(chrome小于40 firefox小于50 ie小于9)会提示升级信息
  19. python中“羊车门问题”的简单分析与代码实现
  20. python爬虫实战之爬取51job前程无忧简历

热门文章

  1. Photoshop 技能大全(包括九大类技能)
  2. 第二次试验上机2循环结构
  3. 算法竞赛入门经典--古老的密码
  4. Docker学习:在官网获取Docker的最新版本 | Docker都有哪些版本 | 获取Tomcat指定版本镜像 | 获取JDK指定版本镜像
  5. R语言----方差与协方差分析
  6. 特斯拉,一个人造的天才(未完待续)
  7. 阿里云pts做性能测试
  8. 创造与魔法怎么去最新服务器,创造与魔法怎么进入同一个服务器 | 手游网游页游攻略大全...
  9. 零基础python入门书籍推荐读哪些书?
  10. 【GPS识别】低信噪比环境下GPS信号识别的MATLAB仿真