• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >数据结构 > 数据结构C语言实现之二叉树

数据结构C语言实现之二叉树

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2017-06-28

匿名通过本文主要向大家介绍了数据结构二叉树c语言,数据结构c 二叉树,数据结构创建二叉树,数据结构二叉树,数据结构树和二叉树等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
</div>

  #include <stdio.h>
   #include <stdlib.h>
   #define STACK_MAX_SIZE 30
   #define QUEUE_MAX_SIZE 30
   #ifndef elemType
   typedef char elemType;
   #endif
   /************************************************************************/
   /*           以下是关于二叉树操作的11个简单算法        */
   /************************************************************************/
   struct BTreeNode{
   elemType data;
   struct BTreeNode *left;
   struct BTreeNode *right;
   };
   /* 1.初始化二叉树 */
   void initBTree(struct BTreeNode* *bt)
   {
   *bt = NULL;
   return;
   }
   /* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */
   void createBTree(struct BTreeNode* *bt, char *a)
   {
   struct BTreeNode *p;
   struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */
   int top = -1;/* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */
   int k;/* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */
   int i = 0;/* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */
   *bt = NULL;/* 把树根指针置为空,即从空树开始建立二叉树 */
   /* 每循环一次处理一个字符,直到扫描到字符串结束符为止 */
   while(a[i] != ''){
   switch(a[i]){
   case ' ':
   break; /* 对空格不作任何处理 */
   case '(':
   if(top == STACK_MAX_SIZE - 1){
   printf("栈空间太小! ");
   exit(1);
   }
   top++;
   s[top] = p;
   k = 1;
   break;
   case ')':
   if(top == -1){
   printf("二叉树广义表字符串错误! ");
   exit(1);
   }
   top--;
   break;
   case ',':
   k = 2;
   break;
   default:
   p = malloc(sizeof(struct BTreeNode));
   p->data = a[i];
   p->left = p->right = NULL;
   if(*bt == NULL){
   *bt = p;
   }else{
   if( k == 1){
   s[top]->left = p;
   }else{
   s[top]->right = p;
   }
   }
   }
   i++; /* 为扫描下一个字符修改i值 */
   }
   return;
   }
   /* 3.检查二叉树是否为空,为空则返回1,否则返回0 */
   int emptyBTree(struct BTreeNode *bt)
   {
   if(bt == NULL){
   return 1;
   }else{
   return 0;
   }
   }
   /* 4.求二叉树深度 */
   int BTreeDepth(struct BTreeNode *bt)
   {
   if(bt == NULL){
   return 0; /* 对于空树,返回0结束递归 */
   }else{
   int dep1 = BTreeDepth(bt->left); /* 计算左子树的深度 */
   int dep2 = BTreeDepth(bt->right); /* 计算右子树的深度 */
   if(dep1 > dep2){
   return dep1 + 1;
   }else{
   return dep2 + 1;
   }
   }
   }
   /* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */
   elemType *findBTree(struct BTreeNode *bt, elemType x)
   {
   if(bt == NULL){
   return NULL;
   }else{
   if(bt->data == x){
   return &(bt->data);
   }else{/* 分别向左右子树递归查找 */
   elemType *p;
   if(p = findBTree(bt->left, x)){
   return p;
   }
   if(p = findBTree(bt->right, x)){
   return p;
   }
   return NULL;
   }
   }
   }
   /* 6.输出二叉树(前序遍历) */
   void printBTree(struct BTreeNode *bt)
   {
   /* 树为空时结束递归,否则执行如下操作 */
   if(bt != NULL){
   printf("%c", bt->data); /* 输出根结点的值 */
   if(bt->left != NULL || bt->right != NULL){
   printf("(");
   printBTree(bt->left);
   if(bt->right != NULL){
   printf(",");
   }
   printBTree(bt->right);
   printf(")");
   } 
   }
   return;
   }
   /* 7.清除二叉树,使之变为一棵空树 */
   void clearBTree(struct BTreeNode* *bt)
   {
   if(*bt != NULL){
   clearBTree(&((*bt)->left));
   clearBTree(&((*bt)->right));
   free(*bt);
   *bt = NULL;
   }
   return;
   }
   /* 8.前序遍历 */
   void preOrder(struct BTreeNode *bt)
   {
   if(bt != NULL){
   printf("%c ", bt->data); /* 访问根结点 */
   preOrder(bt->left);  /* 前序遍历左子树 */
   preOrder(bt->right); /* 前序遍历右子树 */
   }
   return;
   }
   /* 9.前序遍历 */
   void inOrder(struct BTreeNode *bt)
   {
   if(bt != NULL){
   inOrder(bt->left);  /* 中序遍历左子树 */
   printf("%c ", bt->data); /* 访问根结点 */
   inOrder(bt->right);  /* 中序遍历右子树 */
   }
   return;
   }
   /* 10.后序遍历 */
   void postOrder(struct BTreeNode *bt)
   {
   if(bt != NULL){
   postOrder(bt->left); /* 后序遍历左子树 */
   postOrder(bt->right); /* 后序遍历右子树 */
   printf("%c ", bt->data); /* 访问根结点 */
   }
   return;
   }
   /* 11.按层遍历 */
   void levelOrder(struct BTreeNode *bt)
   {
   struct BTreeNode *p;
   struct BTreeNode *q[QUEUE_MAX_SIZE];
   int front = 0, rear = 0;
   /* 将树根指针进队 */
   if(bt != NULL){
   rear = (rear + 1) % QUEUE_MAX_SIZE;
   q[rear] = bt;
   }
   while(front != rear){ /* 队列非空 */
   front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
   p = q[front];
   printf("%c ", p->data);
   /* 若结点存在左孩子,则左孩子结点指针进队 */
   if(p->left != NULL){
   rear = (rear + 1) % QUEUE_MAX_SIZE;
   q[rear] = p->left;
   }
   /* 若结点存在右孩子,则右孩子结点指针进队 */
   if(p->right != NULL){
   rear = (rear + 1) % QUEUE_MAX_SIZE;
   q[rear] = p->right;
   }
   }
   return;
   }
   /************************************************************************/
   /*
   int main(int argc, char *argv[])
   {
   struct BTreeNode *bt;/* 指向二叉树根结点的指针 */
   char *b;  /* 用于存入二叉树广义表的字符串 */
   elemType x, *px;
   initBTree(&bt);
   printf("输入二叉树广义表的字符串: ");
   /* scanf("%s", b); */
   b = "a(b(c), d(e(f, g), h(, i)))";
   createBTree(&bt, b);
   if(bt != NULL)
   printf(" %c ", bt->data);
   printf("以广义表的形式输出: ");
   printBTree(bt); /* 以广义表的形式输出二叉树 */
   printf(" ");
   printf("前序:"); /* 前序遍历 */
   preOrder(bt);
   printf(" ");
   printf("中序:"); /* 中序遍历 */
   inOrder(bt);
   printf(" ");
   printf("后序:"); /* 后序遍历 */
   postOrder(bt);
   printf(" ");
   printf("按层:"); /* 按层遍历 */
   levelOrder(bt);
   printf(" ");
   /* 从二叉树中查找一个元素结点 */
   printf("输入一个待查找的字符: ");
   scanf(" %c", &x); /* 格式串中的空格跳过空白字符 */
   px = findBTree(bt, x);
   if(px){
   printf("查找成功:%c ", *px);
   }else{
   printf("

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 数据结构C语言实现之二叉树

相关文章

  • 2017-06-28数据结构教程 第二十一课 树、二叉树定义及术语
  • 2017-06-28数据结构教程 第二十二课 实验五 数组实验
  • 2017-06-28数据结构教程 第十六课 串操作应用举例
  • 2017-06-28数据结构教程 第十四课 串的定义
  • 2017-08-17算法学习之旅,初级篇(30)-–删除链表内节点
  • 2017-06-28数据结构教程 第三十二课 哈希表(一)
  • 2017-06-28数据结构教程 第二十四课 遍历二叉树
  • 2017-06-28java中实现希尔排序算法
  • 2017-06-28PB动态创建菜单的核心算法描述
  • 2017-06-28J2ME中的基础碰撞检测算法浅析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • oracle用存储过程加密一段字符串(3des算法)
    • 数据结构教程 第二十八课 图的存储结构
    • 数据结构教程 第十八课 数组的顺序表示与实现
    • 复杂链表复制
    • 数据结构教程 第十四课 串的定义
    • 数据结构教程 第三十五课 实验七 查找
    • 模拟退火算法求解TSP问题
    • 数据结构教程 第三十四课 插入排序、快速排序
    • 数据结构教程 第十课 栈的表示与实现
    • java排序算法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有