C语言二叉树之二叉链表
#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语言二叉树之二叉链表相关推荐
- 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...
已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...
- 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适
题目 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适?(北京航空航天大学1999,北京工业大学2016) A. 前序 B. 中序 C. 后序 D. 层次 ...
- 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结
假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点).pat ...
- 二叉树的二叉链表表示与基本操作
二叉树的二叉链表表示与基本操作(伪代码详细注释版,含源码) 一.二叉链表表示法 1. 二叉树 2. 二叉链表 二.二叉树的遍历(输出结点) 1. 层次遍历 2. 先序.中序.后序遍历(递归算法) 3. ...
- 已知一棵完全二叉树存于顺序表sa中,sa.elem[1..sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表。
已知一棵完全二叉树存于顺序表sa中,sa.elem[1-sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表. 分析:由二叉树的性质可知,一个下标为i的节点若有左子树,则其左 ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- C语言实现二叉树(二叉链表)
文章目录 定义结构体 初始化 先序遍历创建二叉树 方法一 测试 方法二:根据所给的字符串序列创建 其他方法 树的结点大小 树的高 判断树空 找某个结点的左孩子和右孩子 找某个结点的父节点 查找元素 拷 ...
- 二叉树的二叉链表存储结构构建以及先序遍历
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int TElemTy ...
- c++数据结构二叉树(二叉链表实现)基本操作实现
二叉树: 二叉树(Binary tree)是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二 ...
最新文章
- Python - while语句和if语句 的 用法 及 代码
- document.getElementByName()的用法
- python一次性输入10个数_python如何一次性输入多个数
- python 控件显示时间_设置tkinter标签以显示倒计时时间
- Spring5 - Bean的初始化和销毁的4种方式
- 【常用】鼠标拖动物体移动
- OSGI和Spring动态模块–简单的Hello World
- 为什么传值时加号变成了空格_URL的参数中有加号传值变为空格的问题(URL特殊字符)...
- 外设驱动库开发笔记12:TSEV01CL55红外温度传感器驱动
- 为什么我们选择 Flutter 开发移动应用?
- 海康威视网络摄像头SDK中Demo的二次开发(运行)
- 【产品】固定成本、可变成本、沉没成本和机会成本
- mtk audio笔记
- 领英改版后无法搜索开发客户?解决方法来了,恢复后可以继续在领英搜索开发客户。
- Android学习网站推荐
- 大连将在东京建设软件园
- 清空数据库表结构的几种方式
- 用Java/Python/PHP/C#/C++各大城市招聘状况分析
- 迭代器模式(实际运用比较少)
- 中国新能源汽车行业运作模式与供需形势分析报告2022版