C语言描述二叉树的实现及操作(链表实现)
概述
二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树。
前序遍历:根结点 ---> 左子树 ---> 右子树。
中序遍历:左子树---> 根结点 ---> 右子树。
后序遍历:左子树 ---> 右子树 ---> 根结点。
节点深度:节点ni的深度(depth)为从根到ni的唯一路径的长。根的深度为0。
节点的高:节点ni的高(height)为从ni到一片树叶的最长路径。所有的树叶(没有儿子节点的节点)的高都为0。一棵树的高等于它的根的高。
代码实现
// 二叉树的实现(C语言)
// 链表,递归实现
// 编译环境:visual studio 2017
// 操作系统:win8.1 #include<stdio.h>
#include<malloc.h>
#include<stdlib.h> typedef char Elementtype; // 定义数据类型,可根据需要自行定制
typedef struct TreeNode * Node; // Node相当于struct treeNode *
// 定义数节点结构
typedef struct TreeNode {
Elementtype Element;
Node left; // 树节点的左子节点
Node right; // 树节点的右子节点
}TREE,*PTREE; // 函数声明
void CreatTree(PTREE *); // 树的先序创建函数
void PreOrderTree(PTREE ); // 树的前序遍历函数
void InOrderTree(PTREE ); // 树的中序遍历
void PostOrderTree(PTREE ); // 树的后序遍历
void LeafOfTree(PTREE ); // 打印树的叶子节点函数
int Get_Leaf_Num(PTREE ); // 获取树叶子节点个数
int Get_Height(PTREE ); // 获取树的高度 // 主函数
int main() { PTREE Root;
printf("请先序输入二叉树的节点数据: ");
CreatTree(&Root);
printf("\n前序遍历结果为:");
PreOrderTree(Root);
printf("\n中序遍历结果为:");
InOrderTree(Root);
printf("\n后序遍历结果为:");
PostOrderTree(Root);
printf("\n打印叶子节点为:");
LeafOfTree(Root);
printf("\n叶子节点个数为:%d", Get_Leaf_Num(Root));
printf("\n二叉树的高度为:%d", Get_Height(Root));
printf("\n"); return ;
} // 定义树先序创建函数
void CreatTree(PTREE *Root) {
char val=; // 用于下面存放数据
val=getchar(); // 输入数据值
// 如果输入'*',则指向为空
if (val == '*')
(*Root) = NULL;
// 如果输入非'*',则给数据域赋值
else {
(*Root) = (PTREE)malloc(sizeof(TREE)); // 申请内存空间
if ((*Root) == NULL) {
printf("创建节点失败,无法分配可用内存...");
exit(-);
}
else {
(*Root)->Element = val; // 给节点数据域赋值
CreatTree(&(*Root)->left);
CreatTree(&(*Root)->right);
}
} }
// 树的前序遍历函数定义
void PreOrderTree(PTREE Root) { if (Root == NULL)
return;
else {
putchar(Root->Element);
PreOrderTree(Root->left);
PreOrderTree(Root->right); }
}
// 树的中序遍历函数定义
void InOrderTree(PTREE Root) { if (Root == NULL)
return;
else {
InOrderTree(Root->left);
putchar(Root->Element);
InOrderTree(Root->right); }
} // 树的后序遍历函数定义
void PostOrderTree(PTREE Root) { if (Root==NULL)
return ;
else{
PostOrderTree(Root->left);
PostOrderTree(Root->right);
putchar( Root->Element);
}
} // 打印树的叶子节点函数定义
void LeafOfTree(PTREE Tree) {
if (Tree == NULL)
return ; else {
if (Tree->left == NULL&&Tree->right == NULL)
putchar(Tree->Element);
else {
LeafOfTree(Tree->left);
LeafOfTree(Tree->right);
}
} } // 获取树的叶子节点个数函数定义
int Get_Leaf_Num(PTREE Tree) {
if (Tree == NULL)
return ;
if (Tree->left == NULL&&Tree->right == NULL)
return ;
//递归整个树的叶子节点个数 = 左子树叶子节点的个数 + 右子树叶子节点的个数
return Get_Leaf_Num(Tree->left) + Get_Leaf_Num(Tree->right);
}
// 获取树高的函数定义
int Get_Height(PTREE Tree) {
int Height = ;
if (Tree == NULL)
return ; //树的高度 = max(左子树的高度,右子树的高度) + 1
else
{
int L_Height = Get_Height(Tree->left);
int R_Height = Get_Height(Tree->right);
Height = L_Height >= R_Height ? L_Height + : R_Height + ;
}
return Height;
}
运行结果

C语言描述二叉树的实现及操作(链表实现)的更多相关文章
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- C语言描述栈的实现及操作(数组实现)
一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...
- C语言描述栈的实现及操作(链表实现)
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...
- C语言描述队列的实现及操作(链表实现)
// 队列的单链表实现 // 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方 // 首节点:头节点后第一个节点,存放数据 #include<stdio.h> #incl ...
- C语言描述队列的实现及操作(数组实现)
一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...
- 【数据结构】之二叉树(Java语言描述)
有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...
- 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)
数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...
- 数据结构--Java语言描述
本篇文章是为了记录自己在学习数据结构时的笔记,会对常见的数据结构做基本的介绍以及使用Java语言进行实现.包括 动态数组 栈 队列 链表 二分搜索树 优先队列和堆 线段树 Trie树 并查集 AVL树 ...
随机推荐
- echarts中的option.legend.data has not been defined.
1.错误描述 2.错误原因 var map = function(mapData){ require( [ 'echarts', 'echarts/chart/map' ], function (ec ...
- JavaScript去除日期中的“-”
JavaScript去除日期中的"-" 1.说明 经常会出现这样的情况,页面的日期格式是:YYYY-MM-DD,而数据库中的日期格式是:YYYYMMDD,两者之间需要转换一下,方能 ...
- MPEG2_TS流基本概念和数据结构
时对应network_PID,program_number等于其它值时对应program_map_PID. (3)PMT PMT数据结构如下: TS_program_map_section(){ ...
- Flex动态获取数据,服务中断报错
1.错误原因 2.错误原因 由上面提示可知,软件引起的链接中断,导致出错 3.解决办法 检查数据库链接,重新启动服务
- .Net+SQL Server企业应用性能优化笔记—精确查找瓶颈
首先我们需要部署一个测试环境,将Web项目的源代码拷到测试环境Web服务器IIS上,使得可以直接通过IE访问我们的网站.SQL Server环境可以部署在同一台机器上,条件允许的话有专门的数据库测试服 ...
- 小白——java基础之数据类型
PS:此文章为小白提供,大佬请绕道!!!! 首先特别感谢大才哥给我提供这个平台,未来我希望把java这个版块的内容补全. 今天要讲的是数据类型,最最最基础的内容~ java标识符.数据类型.关键字 开 ...
- CSS实现网页背景图片自适应全屏
一张清晰漂亮的背景图片能给网页加分不少,设计师也经常会给页面的背景使用大图,我们既不想图片因为不同分辨率图片变形,也不希望当在大屏的情况下,背景有一块露白,简而言之,就是实现能自适应屏幕大小又不会变形 ...
- RobotFramework下的http接口自动化post关键字的使用
在http协议中,除了get请求外,另一个最常用的就是post请求了.和get 请求类似,post请求接收一个参数,[ url ] 示例1:调用博客园(http://www.cnblogs.com/) ...
- Css Secret 案例全套
Css Secret 案例全套 github地址 案例地址 该书揭示了 47 个鲜为人知的 CSS 技巧,主要内容包括背景与边框.形状. 视觉效果.字体排印.用户体验.结构与布局.过渡与动画等.去年买 ...
- manacher模板(manacher)
洛谷题目传送门 写完有一段时间了,发现板子忘记存在了这里...... 算法简述 一种字符串算法,\(O(n)\)高效求出以每个字符为对称中心的最长回文串长度. 然后,就可以进一步求出全串中最长回文串的 ...