#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>/* 二叉链表 */
typedef struct BTNode{char ch;struct BTNode *lchild, *rchild;}BTNode, *BinTree;BTNode *newBTNode(char ch)
{BTNode *node = (BTNode*)malloc(sizeof(BTNode));node->ch = ch;node->lchild = NULL;node->rchild = NULL;
}void addLchild(BinTree *bt, char ch)
{BTNode *node = newBTNode(ch);(*bt)->lchild = node;
}void addRchild(BinTree *bt, char ch)
{BTNode *node = newBTNode(ch);(*bt)->rchild = node;
}void priOrder(BinTree bt)
{if(bt){printf("%c",bt->ch);priOrder(bt->lchild);priOrder(bt->rchild);}
}
void midOrder(BinTree bt)
{if(bt){midOrder(bt->lchild);printf("%c",bt->ch);midOrder(bt->rchild);}
}
void postOrder(BinTree bt)
{if(bt){postOrder(bt->lchild);postOrder(bt->rchild);printf("%c",bt->ch);}
}int main(int argc, char*argv[])
{char ch[11] = {'a','b','c','d','e','f','g','h','i','j','q'};BinTree bt = (BTNode*)malloc(sizeof(BTNode));bt->ch = ch[0];addLchild(&bt, ch[1]);addRchild(&bt, ch[2]);addLchild(&(bt->lchild), ch[3]);addRchild(&(bt->lchild), ch[4]);addLchild(&(bt->rchild), ch[5]);addRchild(&(bt->rchild), ch[6]);printf(" Prior : ");priOrder(bt);printf("\n");printf("Middle : ");midOrder(bt);printf("\n");printf("  Post : ");postOrder(bt);printf("\n");return 0;
}

结果:

-bash-4.1$ gcc -o a Demo.c
-bash-4.1$ ./aPrior : abdecfg
Middle : dbeafcgPost : debfgca
-bash-4.1$ 

2.二叉链表树的输入(前序、中序、后序):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>/* 二叉链表 */
typedef struct BTNode{char ch;struct BTNode *lchild, *rchild;}BTNode, *BinTree;BTNode *newBTNode(char ch)
{BTNode *node = (BTNode*)malloc(sizeof(BTNode));node->ch = ch;node->lchild = NULL;node->rchild = NULL;
}void addLchild(BinTree *bt, char ch)
{BTNode *node = newBTNode(ch);(*bt)->lchild = node;
}void addRchild(BinTree *bt, char ch)
{BTNode *node = newBTNode(ch);(*bt)->rchild = node;
}void priOrder(BinTree bt)
{if(bt){printf("%c",bt->ch);priOrder(bt->lchild);priOrder(bt->rchild);}
}
void midOrder(BinTree bt)
{if(bt){midOrder(bt->lchild);printf("%c",bt->ch);midOrder(bt->rchild);}
}
void postOrder(BinTree bt)
{if(bt){postOrder(bt->lchild);postOrder(bt->rchild);printf("%c",bt->ch);}
}/* 销毁二叉树T */
void destoryBinTree(BinTree *bt)
{if(*bt){if((*bt)->lchild){destoryBinTree(&(*bt)->lchild);}if((*bt)->rchild){destoryBinTree(&(*bt)->rchild);}free(*bt);*bt = NULL;}
}/* 按前序输入二叉树中结点的值(一个字符) */
void priorInputBinTree(BinTree *bt)
{char c;scanf("%c",&c);if(c == 'q'){*bt = NULL;   } else {*bt = (BinTree)malloc(sizeof(BTNode));(*bt)->ch = c;priorInputBinTree(&(*bt)->lchild);priorInputBinTree(&(*bt)->rchild);}
}
/* 按middle序输入二叉树中结点的值(一个字符) */
void midInputBinTree(BinTree *bt)
{char c;scanf("%c",&c);if(c == 'q'){*bt = NULL;   } else {*bt = (BinTree)malloc(sizeof(BTNode));priorInputBinTree(&(*bt)->lchild);(*bt)->ch = c;priorInputBinTree(&(*bt)->rchild);}
}
/* 按post序输入二叉树中结点的值(一个字符) */
void postInputBinTree(BinTree *bt)
{char c;scanf("%c",&c);if(c == 'q'){*bt = NULL;   } else {*bt = (BinTree)malloc(sizeof(BTNode));priorInputBinTree(&(*bt)->lchild);priorInputBinTree(&(*bt)->rchild);(*bt)->ch = c;}
}/* 初始条件: 二叉树T存在 */
/* 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE */
char* BinTreeEmpty(BinTree bt)
{ if(bt)return "Binary tree isn't empty!";elsereturn "Binary tree is empty!";
}/* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */
int depthOfBinTree(BinTree bt)
{int i, j;if(bt->lchild){i = depthOfBinTree(bt->lchild);} else i = 0;if(bt->rchild){j = depthOfBinTree(bt->rchild);} else j = 0;return i>j?++i:++j;
}int main(int argc, char*argv[])
{char ch[11] = {'a','b','c','d','e','f','g','h','i','j','q'};BinTree bt = (BTNode*)malloc(sizeof(BTNode));bt->ch = ch[0];addLchild(&bt, ch[1]);addRchild(&bt, ch[2]);addLchild(&(bt->lchild), ch[3]);addRchild(&(bt->lchild), ch[4]);addLchild(&(bt->rchild), ch[5]);addRchild(&(bt->rchild), ch[6]);printf(" Prior : ");priOrder(bt);printf("\n");printf("Middle : ");midOrder(bt);printf("\n");printf("  Post : ");postOrder(bt);printf("\n");destoryBinTree(&bt);printf("%s\n",BinTreeEmpty(bt));//bt = (BTNode*)malloc(sizeof(BTNode));//bt->ch = ch[0];//addLchild(&bt, ch[1]);//addRchild(&bt, ch[2]);priorInputBinTree(&bt);//midInputBinTree(&bt);printf("%s\n",BinTreeEmpty(bt));printf("The depth of binary tree is %d\n",depthOfBinTree(bt));printf(" Prior : ");priOrder(bt);printf("\n");printf("Middle : ");midOrder(bt);printf("\n");printf("  Post : ");postOrder(bt);printf("\n");return 0;
}

结果为:

-bash-4.1$ gcc -o a Demo.c
-bash-4.1$ ./aPrior : abdecfg
Middle : dbeafcgPost : debfgca
Binary tree is empty!
abdqqeqqcfqqgqq
Binary tree isn't empty!
The depth of binary tree is 3Prior : abdecfg
Middle : dbeafcgPost : debfgca
-bash-4.1$

值得注意的是二叉树的输入!!!!!!!

C语言二叉树之二叉链表相关推荐

  1. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...

    已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...

  2. 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适

    题目 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适?(北京航空航天大学1999,北京工业大学2016) A. 前序 B. 中序 C. 后序 D. 层次 ...

  3. 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结

    假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点).pat ...

  4. 二叉树的二叉链表表示与基本操作

    二叉树的二叉链表表示与基本操作(伪代码详细注释版,含源码) 一.二叉链表表示法 1. 二叉树 2. 二叉链表 二.二叉树的遍历(输出结点) 1. 层次遍历 2. 先序.中序.后序遍历(递归算法) 3. ...

  5. 已知一棵完全二叉树存于顺序表sa中,sa.elem[1..sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表。

    已知一棵完全二叉树存于顺序表sa中,sa.elem[1-sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表. 分析:由二叉树的性质可知,一个下标为i的节点若有左子树,则其左 ...

  6. C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)

    今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...

  7. C语言实现二叉树(二叉链表)

    文章目录 定义结构体 初始化 先序遍历创建二叉树 方法一 测试 方法二:根据所给的字符串序列创建 其他方法 树的结点大小 树的高 判断树空 找某个结点的左孩子和右孩子 找某个结点的父节点 查找元素 拷 ...

  8. 二叉树的二叉链表存储结构构建以及先序遍历

    #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int TElemTy ...

  9. c++数据结构二叉树(二叉链表实现)基本操作实现

    二叉树: 二叉树(Binary tree)是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二 ...

最新文章

  1. Python - while语句和if语句 的 用法 及 代码
  2. document.getElementByName()的用法
  3. python一次性输入10个数_python如何一次性输入多个数
  4. python 控件显示时间_设置tkinter标签以显示倒计时时间
  5. Spring5 - Bean的初始化和销毁的4种方式
  6. 【常用】鼠标拖动物体移动
  7. OSGI和Spring动态模块–简单的Hello World
  8. 为什么传值时加号变成了空格_URL的参数中有加号传值变为空格的问题(URL特殊字符)...
  9. 外设驱动库开发笔记12:TSEV01CL55红外温度传感器驱动
  10. 为什么我们选择 Flutter 开发移动应用?
  11. 海康威视网络摄像头SDK中Demo的二次开发(运行)
  12. 【产品】固定成本、可变成本、沉没成本和机会成本
  13. mtk audio笔记
  14. 领英改版后无法搜索开发客户?解决方法来了,恢复后可以继续在领英搜索开发客户。
  15. Android学习网站推荐
  16. 大连将在东京建设软件园
  17. 清空数据库表结构的几种方式
  18. 用Java/Python/PHP/C#/C++各大城市招聘状况分析
  19. 迭代器模式(实际运用比较少)
  20. 中国新能源汽车行业运作模式与供需形势分析报告2022版

热门文章

  1. 架构模式: 服务器端页面碎片化元素构建
  2. HTML_DOM的node屬性
  3. docker使用阿里云镜像仓库
  4. Tween Animation----Translate位置移动动画
  5. DrawerLayout 使用
  6. angularJS开发碰到的问题
  7. poj 1236 Network of Schools (强连通分支缩点)
  8. 《教孩子编程(Python语言版)》课程介绍
  9. crontab java 乱码_crontab 任务程序执行乱码的问题
  10. 图片素材网站|找素材、提升审美力就靠它了!