#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 100 /* 存储空间初始分配量 */

typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */

/* 用于构造二叉树********************************** */
int index=1;
typedef char String[24]; /* 0号单元存放串的长度 */
String str;

Status StrAssign(String T,char *chars)
{
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}
/* ************************************************ */

typedef char TElemType;
TElemType Nil=' '; /* 字符型以空格符为空 */

Status visit(TElemType e)
{
printf("%c ",e);
return OK;
}

typedef struct BiTNode /* 结点结构 */
{
TElemType data; /* 结点数据 */
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;

/* 构造空二叉树T */
Status InitBiTree(BiTree *T)
{
*T=NULL;
return OK;
}

/* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */
void DestroyBiTree(BiTree *T)
{
if(*T)
{
if((*T)->lchild) /* 有左孩子 */
DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */
if((*T)->rchild) /* 有右孩子 */
DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */
free(*T); /* 释放根结点 */
*T=NULL; /* 空指针赋0 */
}
}

/* 按前序输入二叉树中结点的值(一个字符) */
/* #表示空树,构造二叉链表表示二叉树T。 */
void CreateBiTree(BiTree *T)
{
TElemType ch;

/* scanf("%c",&ch); */
ch=str[index++];

if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
exit(OVERFLOW);
(*T)->data=ch; /* 生成根结点 */
CreateBiTree(&(*T)->lchild); /* 构造左子树 */
CreateBiTree(&(*T)->rchild); /* 构造右子树 */
}
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE */
Status BiTreeEmpty(BiTree T)
{
if(T)
return FALSE;
else
return TRUE;
}

#define ClearBiTree DestroyBiTree

/* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */
int BiTreeDepth(BiTree T)
{
int i,j;
if(!T)
return 0;
if(T->lchild)
i=BiTreeDepth(T->lchild);
else
i=0;
if(T->rchild)
j=BiTreeDepth(T->rchild);
else
j=0;
return i>j?i+1:j+1;
}

/* 初始条件: 二叉树T存在。操作结果: 返回T的根 */
TElemType Root(BiTree T)
{
if(BiTreeEmpty(T))
return Nil;
else
return T->data;
}

/* 初始条件: 二叉树T存在,p指向T中某个结点 */
/* 操作结果: 返回p所指结点的值 */
TElemType Value(BiTree p)
{
return p->data;
}

/* 给p所指结点赋值为value */
void Assign(BiTree p,TElemType value)
{
p->data=value;
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 前序递归遍历T */
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 中序递归遍历T */
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild); /* 中序遍历左子树 */
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}

/* 初始条件: 二叉树T存在 */
/* 操作结果: 后序递归遍历T */
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
}

int main()
{
int i;
BiTree T;
TElemType e1;
InitBiTree(&T);

StrAssign(str,"ABDH#K###E##CFI###G#J##");

CreateBiTree(&T);

printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));
e1=Root(T);
printf("二叉树的根为: %c\n",e1);

printf("\n前序遍历二叉树:");
PreOrderTraverse(T);
printf("\n中序遍历二叉树:");
InOrderTraverse(T);
printf("\n后序遍历二叉树:");
PostOrderTraverse(T);
ClearBiTree(&T);
printf("\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));
i=Root(T);
if(!i)
printf("树空,无根\n");

return 0;
}

转载于:https://www.cnblogs.com/nku-wangfeng/p/7635146.html

二叉树链式结构实现C语言相关推荐

  1. 二叉树链式结构的实现

    目录 1.二叉树链式结构的实现 1.1前置说明 1.2二叉树的遍历 1.2.1前序.中序以及后序遍历 1.2.2层序遍历 1.3二叉树节点个数及高度等 1.4二叉树的创建和销毁 1.5完全二叉树的判断 ...

  2. 二叉树的链式结构的非递归遍历

    二叉树的链式结构的非递归遍历 一. 非递归前序遍历和非递归中序遍历 1.    Stack.h #ifndef__STACK_H__ #define__STACK_H__ #include<st ...

  3. 二叉树的链式结构递归遍历实现

    二叉树的链式结构递归遍历实现 1.     BinTree.h文件 #ifndef__BINTREE_H__ #define__BINTREE_H__ #include<stdio.h> ...

  4. 每天一道LeetCode-----将二叉树原地平铺成链式结构

    Flatten Binary Tree to Linked List 原题链接Flatten Binary Tree to Linked List 给定一个二叉树,将其原地平铺成链式结构(按先序遍历的 ...

  5. java链式结构_java语言实现队列顺序结构与链式结构

    本文主要向大家介绍了java语言实现队列顺序结构与链式结构,通过具体的内容向大家展示,希望对大家学习java语言有所帮助. 队列的顺序存储结构实现 public class Queue{ privat ...

  6. 【数据结构初阶】第八篇——二叉树的链式结构(二叉树的前、中和后序遍历+层序遍历+链式结构的实现+相关简单的递归问题)

    ⭐️本篇博客我要来和大家一起聊一聊数据结构中的二叉树的链式结构的实现及相关的一些问题的介绍 ⭐️博客代码已上传至gitee:https://gitee.com/byte-binxin/data-str ...

  7. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  8. java链式结构_(Java)单链表Java语言链式结构实现(数据结构四)

    1.迭代器接口实现 package com.zhaochao; public interface Iterator { boolean hasNext(); E next(); boolean del ...

  9. c语言二叉树链式存储,C语言 二叉树的链式存储实例

    二叉树的链式存储 实现二叉树的基本操作:建立.遍历.计算深度.结点数.叶子数等. 输入C,先序创建二叉树,#表示空节点: 输入H:计算二叉树的高度: 输入L:计算二叉树的叶子个数: 输入N:计算二叉树 ...

最新文章

  1. 月英爱耀承(帮别人名字作诗)
  2. master-worker常驻型程序代码修改哪些需要重启master或者worker
  3. python expect模块_成为顶级黑客--python绝技 阅读笔记(五)
  4. JIRA-6.3.6安装与破解
  5. 大前端快闪二:react开发模式 一键启动多个服务
  6. 电子计算机专业211大学,这所高校不是211,但“计算机”实力远超985,被称“IT人才摇篮”...
  7. 神州数码最佳实践之一:向项目管理要效益
  8. 三角形外接圆圆心坐标
  9. matlab 参数辨识,Matlab系统辨识尝试之详细过程1
  10. 极光java sdk_极光使用服务端使用java sdk 出现异常 日志如下
  11. 电阻式触摸屏UI设计
  12. Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) E. Vasya and Good Sequen
  13. VC浏览器相关的学习(一)(Single document界面)
  14. element表格实现折叠效果
  15. iOS开发-定制多样式二维码
  16. 【毕业设计】深度学习人体语义分割在弹幕防遮挡上的实现 - python
  17. 如何写出让同事无法维护的代码?
  18. mt7620a上带机量的提高(三)
  19. CentOS下如何完全卸载MySQL
  20. 郑清oj1191:数星星(结构体专题)

热门文章

  1. php 后端调试,一般如何调试php程序
  2. 导出mysql数据库表结构文档
  3. Command line is too long. Shorten command line for Doc.generateAsciiDocs or
  4. reactive streams的Mono及Flux
  5. spring-kafka、kafka-client 和springboot的版本对应关系
  6. Linux中locate命令查找文件位置
  7. matlab gui 表面粗糙度 算法,石墨加工表面粗糙度图像评定办法
  8. 理论应用实例水杯_PLC应用,3个PID控制实例讲解,想不会都难!
  9. phoenixframework自动化测试平台1.4.6版本发布
  10. nginx负载均衡文件服务器配置虚拟目录代理refer防盗链