需要用到队列

queue.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __cplusplus
extern "C"{
#endifstruct queuenode{struct queuenode *next;};struct lqueue{struct queuenode header;//头结点int size;struct queuenode *rear;//尾指针};typedef void* linkqueue;//初始化linkqueue init_queue();//入队void push_queue(linkqueue queue, void *data);//出队void pop_queue(linkqueue queue);//获得队头元素void* get_top(linkqueue queue);//获得队尾元素void* get_back(linkqueue queue);//大小int get_size(linkqueue queue);//销毁队列void destory_queue(linkqueue queue);#ifdef __cplusplus
}
#endif

queue.c

#define _CRT_SECURE_NO_WARNINGS
#include"queue.h"//初始化
linkqueue init_queue()
{struct lqueue *queue = malloc(sizeof(struct lqueue));if (NULL == queue){return;}queue->header.next = NULL;queue->size = 0;queue->rear = &(queue->header);return queue;
}
//入队
void push_queue(linkqueue queue, void *data)
{if (NULL == queue){return;}if (NULL == data){return;}struct lqueue *q = (struct lqueue *)queue;struct queuenode *node = (struct queuenode *)data;q->rear->next = node;node->next = NULL;q->rear = node;q->size++;}
//出队
void pop_queue(linkqueue queue)
{if (NULL == queue){return;}struct lqueue *q = (struct lqueue *)queue;if (q->size == 0){return;}if (q->size == 1){q->header.next = NULL;q->rear = &(q->header);q->size--;return;}struct queuenode *pfirst = q->header.next;q->header.next = pfirst->next;q->size--;}
//获得队头元素
void* get_top(linkqueue queue)
{if (NULL == queue){return;}struct lqueue *q = (struct lqueue *)queue;return q->header.next;}
//获得队尾元素
void* get_back(linkqueue queue)
{if (NULL == queue){return;}struct lqueue *q = (struct lqueue *)queue;return q->rear;
}
//大小
int get_size(linkqueue queue)
{if (NULL == queue){return;}struct lqueue *q = (struct lqueue *)queue;return q->size;
}
//销毁队列
void destory_queue(linkqueue queue)
{if (NULL == queue){return;}free(queue);queue = NULL;
}

2fucktree.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#include"queue.h"
struct BinNode
{char ch;struct BinNode *lchlid;struct BinNode *rchlid;
};struct Info
{struct queuenode n;struct BinNode *node;bool flag;
};struct Info *creatInfo(struct BinNode *node, bool flag)
{struct Info *info = (struct Info *)malloc(sizeof(struct Info));info->flag = flag;info->node = node;return info;
}//先序遍历 根左右
void  xianxubianli(struct BinNode *root)
{if (NULL == root){return;}printf("%c ", root->ch);//递归遍历左子树xianxubianli(root->lchlid);xianxubianli(root->rchlid);}//中序遍历 左根右
void  zhongxubianli(struct BinNode *root)
{if (NULL == root){return;}zhongxubianli(root->lchlid);printf("%c ", root->ch);//递归遍历左子树zhongxubianli(root->rchlid);}//后序遍历 左右根
void  houxubianli(struct BinNode *root)
{if (NULL == root){return;}houxubianli(root->lchlid);//递归遍历左子树houxubianli(root->rchlid);printf("%c ", root->ch);}void test()
{struct BinNode nodeA = { 'A', NULL, NULL };struct BinNode nodeB = { 'B', NULL, NULL };struct BinNode nodeC = { 'C', NULL, NULL };struct BinNode nodeD = { 'D', NULL, NULL };struct BinNode nodeE = { 'E', NULL, NULL };struct BinNode nodeF = { 'F', NULL, NULL };struct BinNode nodeG = { 'G', NULL, NULL };struct BinNode nodeH = { 'H', NULL, NULL };/*AB       FC          GD E     H*/nodeA.lchlid = &nodeB;nodeA.rchlid = &nodeF;nodeB.rchlid = &nodeC;nodeC.lchlid = &nodeD;nodeC.rchlid = &nodeE;nodeF.rchlid = &nodeG;nodeG.lchlid = &nodeH;printf("========先序遍历\n");xianxubianli(&nodeA);printf("\n");printf("========中序遍历\n");zhongxubianli(&nodeA);printf("\n");printf("========后序遍历\n");houxubianli(&nodeA);printf("\n");printf("================\n");linkqueue *queue = init_queue();
}//叶子节点的个数
void yezi(struct BinNode *root, int *num)
{if (NULL == root){return;}if (root->lchlid == NULL && root->rchlid == NULL){(*num)++;}yezi(root->lchlid, num);yezi(root->rchlid, num);}//树的高度
int  gaodu(struct BinNode *root)
{if (NULL == root){return 0;}//左子树高度int lgao = gaodu(root->lchlid);//右子树高度int rgao = gaodu(root->rchlid);int gao = lgao > rgao ? lgao + 1 : rgao + 1;return gao;}//二叉树拷贝
struct BinNode *cp(struct BinNode *root, struct BinNode **shu)
{if (NULL == root){return NULL;}//先拷贝左子树struct BinNode *lchlid = cp(root->lchlid, shu);//再拷贝右子树struct BinNode *rchlid = cp(root->rchlid, shu);struct BinNode *node = malloc(sizeof(struct BinNode));node->lchlid = lchlid;node->rchlid = rchlid;node->ch = root->ch;//strcpy(node->ch, root->ch);*shu = node;return *shu;
}//二叉树拷贝
struct BinNode *cp1(struct BinNode *root)
{if (NULL == root){return NULL;}//先拷贝左子树struct BinNode *lchlid = cp1(root->lchlid);//再拷贝右子树struct BinNode *rchlid = cp1(root->rchlid);struct BinNode *node = malloc(sizeof(struct BinNode));node->lchlid = lchlid;node->rchlid = rchlid;node->ch = root->ch;//strcpy(node->ch, root->ch);return     node;}//释放内存
void freetree(struct BinNode *root)
{if (NULL == root){return;}freetree(root->lchlid);freetree(root->rchlid);printf("shu=%c ", root->ch);free(root);/*这是错误的 因为先释放左边后释放右边 即使左子树和右子树 都释放后他们的爸爸 还是指向他们 所以直接释放就好if ((root->lchlid == NULL) && (root->rchlid == NULL)){free(root);}*/}//层序遍历 要用队列了void cengxu(struct BinNode *root)
{if (NULL == root){return;}int num = 1;//初始队列linkqueue *queue = init_queue();push_queue(queue, creatInfo(root, true));while (get_size(queue) > 0){struct Info *now = (struct Info *)get_top(queue);printf("%c ", now->node->ch);pop_queue(queue);if (now->node->lchlid != NULL){push_queue(queue, creatInfo(now->node->lchlid, true));}if (now->node->rchlid != NULL){push_queue(queue, creatInfo(now->node->rchlid, true));}//自己押入一个特殊符号free(now);}}//层序遍历1 要用队列了void cengxu1(struct BinNode *root)
{int num = 1;if (NULL == root){return;}struct BinNode *last = root;struct BinNode *nlast = NULL;//初始队列linkqueue *queue = init_queue();push_queue(queue, creatInfo(root, true));while (get_size(queue) > 0){struct Info *now = (struct Info *)get_top(queue);printf("第%d层%c ", num,now->node->ch);pop_queue(queue);if (now->node->lchlid != NULL){nlast = now->node->lchlid;push_queue(queue, creatInfo(now->node->lchlid, true));}if (now->node->rchlid != NULL){nlast = now->node->rchlid;push_queue(queue, creatInfo(now->node->rchlid, true));}if (now->node->ch == last->ch){printf("\n");num++;last = nlast;}//自己押入一个特殊符号free(now);}}void test1()
{struct BinNode nodeA = { 'A', NULL, NULL };struct BinNode nodeB = { 'B', NULL, NULL };struct BinNode nodeC = { 'C', NULL, NULL };struct BinNode nodeD = { 'D', NULL, NULL };struct BinNode nodeE = { 'E', NULL, NULL };struct BinNode nodeF = { 'F', NULL, NULL };struct BinNode nodeG = { 'G', NULL, NULL };struct BinNode nodeH = { 'H', NULL, NULL };/*AB       FC          GD   E          H*/nodeA.lchlid = &nodeB;nodeA.rchlid = &nodeF;nodeB.rchlid = &nodeC;nodeC.lchlid = &nodeD;nodeC.rchlid = &nodeE;nodeF.rchlid = &nodeG;nodeG.lchlid = &nodeH;//先序遍历printf("\n");printf("========先序遍打印=======\n");xianxubianli(&nodeA);int num = 0;yezi(&nodeA, &num);printf("\n");//叶子节点个数printf("叶子节点个数num=%d\n", num);//树的高度int gao = gaodu(&nodeA);printf("树的高度num=%d\n", gao);struct BinNode  *newshu = malloc(sizeof(struct BinNode));cp(&nodeA, &newshu);//先序遍历新拷贝的树1printf("先序遍历新拷贝的树1\n");xianxubianli(newshu);printf("\n");printf("================\n");printf("\n");printf("========层序打印=======\n");cengxu(&nodeA);printf("\n");printf("========层序打层次输出打印=======\n");cengxu1(&nodeA);
}int main(void)
{printf("\n");test1();system("pause");return 0;
}

二叉树层级打印(分层次和不分层次)相关推荐

  1. 二叉树层级遍历_二叉树中的层级顺序遍历

    二叉树层级遍历 Level Order Traversal is one of the methods for traversing across a Binary Tree. In this art ...

  2. oracle数据库分层,Oracle数据库的分层查询(一)

    我们知道关系数据库不是以分层形式存储数据的,那么我们又该如何以分层方法获取数据呢?本文将为你介绍由Oracle提供的分层查询特性,告诉你分层查询的概念,并迎合你的需要构建一个分层查询. 使用分层查询时 ...

  3. 水下摄影分层psd素材水下摄影分层psd素材图片素材

    看到很多水下摄影的婚纱照.个人写真等.当时在想不会游泳怎么拍?后面对这方面了解了一下,其实有的并不是真的是在水下拍的,只是拍的蓝色的纯色背景,然后找些水下psd素材进行合成的!主要是把人抠出来,然后进 ...

  4. 如何实现分层区组随机化,分层随机化,区组随机化

    一.背景 假设我们要实现样本量为100,分组为A.B(比例为1:1),区组长度为4,分层因子是中心A.B(比例为40:60),性别男.女(比例为40:60),怎么实现分层区组随机化了? 二.随机化网站 ...

  5. 实现一个二叉树层级遍历_算法总结:左神class5—二叉树递归和非递归实现遍历(后序用一个栈彩蛋)...

    二叉树类型的题目为常考题型 1.能够结合队列.栈.链表.字符串等很多数据结构. 2.需要掌握图的基本遍历方式,比如BFS和DFS. 3.需要掌握递归函数的使用,并自己设计出递归过程. 4.与实际工作结 ...

  6. 数据仓库物理分层_数据仓库逻辑分层

    OLTP 与 OLAP OLTP 联机事务处理 OLTP是传统关系型数据库的主要应用,主要用于日常事物.交易系统的处理 1.数据量存储相对来说不大 2.实时性要求高,需要支持事物 3.数据一般存储在关 ...

  7. 计算机基础中的分层教学,计算机应用基础分层教学研究

    计算机应用基础分层教学研究 <计算机应用基础>是培养高校学生计算机应用能力和素养的一门重要公共基础课.随着国家教育部对信息教育的重视,各中小学纷纷开设信息技术课程.下面是小编搜集整理的相关 ...

  8. 以太网的分层架构_网络分层结构及各层功能

    一.OSI七层模型&常见五层模型 OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型 ,是一个逻辑上的定义,一个规范,它把网络 ...

  9. PhotoshopCS4轻松将PSD分层导出为Png分层

    大家在网上都下载过PSD分层素材,有时候想把素材分层导出,以往做法是一层一层导出,可是这样效率太低,其实利用PS自带功能可以轻松导出PNG分层.      我们先打开一个PSD文件. 文件有7个图层, ...

最新文章

  1. ADempiere TableDirect类型的reference分析
  2. Jquery中ajax写法
  3. matlab 拉斯,魏尔斯特拉斯函数
  4. 引导页如何在pc端实现
  5. 基于卷积和递归神经网络的物联网流量分类器
  6. Machine Learning笔记——逻辑回归算法
  7. Canonical标签有没有必要使用呢? Canonical标签作用是什么
  8. c语言平均绩点_【干货】你们关心的GPA算法来了!
  9. CnOpenData中国行政区划shp数据
  10. vue读取json文件
  11. vue中的created方法
  12. 基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)
  13. google语音服务注意事项
  14. 笔记本电脑计算机无法启动怎么办,联想笔记本开不了机怎么办 电脑开机进不了系统怎么办...
  15. 聚焦医疗数字化转型 浪潮信息帮助医院提升诊疗效率 保障业务持续运行
  16. windows server2012无法安装IIS,提示:安装一个或多个角色、角色服务或功能失败
  17. 乐优商城笔记-商城系统功能编写
  18. MessagePack简介与在Python中使用msgpack
  19. 蓝牙协议分析(11)_BLE安全机制之Security Manager
  20. C++:计算有n种情况a,b,c中任意一个使之成为最大数需要额外加多少

热门文章

  1. 吴恩达机器学习 11.聚类
  2. [置顶] 怎么对待重复的代码
  3. 服务器电源维修哪里便宜,服务器电源维修
  4. 解决SQLServer占用80端口问题
  5. [Ext JS 4] 实战之Chart, Column Chart 定制颜色
  6. [设计模式-结构型]桥接(Bridge )
  7. Teamcenter 2007 之 Part 物件关联
  8. 保密作战--在网络上隐藏自己
  9. Hibernate的缓存机制介绍
  10. 分页查询为什么会报数组越界错误_Java Note-数据结构(1)数组