概述

     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树。

  前序遍历:根结点 ---> 左子树 ---> 右子树。

  中序遍历:左子树---> 根结点 ---> 右子树。

  后序遍历:左子树 ---> 右子树 ---> 根结点。

  节点深度:节点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语言描述二叉树的实现及操作(链表实现)的更多相关文章

  1. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  2. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  3. C语言描述栈的实现及操作(数组实现)

    一.静态数组实现 1.堆栈接口 // 一个堆栈模块接口 // 命名为stack.h #define STACK_YTPE int // 堆栈所存储值的类型 // push函数 // 把一个新值压入栈中 ...

  4. C语言描述栈的实现及操作(链表实现)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int Elementtype; / ...

  5. C语言描述队列的实现及操作(链表实现)

    // 队列的单链表实现 // 头节点:哨兵作用,不存放数据,用来初始化队列时使队头队尾指向的地方 // 首节点:头节点后第一个节点,存放数据 #include<stdio.h> #incl ...

  6. C语言描述队列的实现及操作(数组实现)

    一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...

  7. 【数据结构】之二叉树(Java语言描述)

    有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...

  8. 数据结构与抽象 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. ...

  9. 数据结构--Java语言描述

    本篇文章是为了记录自己在学习数据结构时的笔记,会对常见的数据结构做基本的介绍以及使用Java语言进行实现.包括 动态数组 栈 队列 链表 二分搜索树 优先队列和堆 线段树 Trie树 并查集 AVL树 ...

随机推荐

  1. javascript parseint

  2. Java和Flex整合报错(二)

    1.错误原因 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  3. Asp.net的sessionState四种模式配置方案

    sessionState节点的配置 web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer ...

  4. javaWeb之自动发送邮件生日祝福(ServletContextListener监听)

    在看完本随笔仍然不理解的可以看  javaWeb邮箱发送  :里面有具体的邮箱服务器配置 企业在员工生日当天发送邮箱生日祝福: 一般是用监听器完成:  而合适的监听是ServletContextLis ...

  5. 芝麻HTTP:TensorFlow LSTM MNIST分类

    本节来介绍一下使用 RNN 的 LSTM 来做 MNIST 分类的方法,RNN 相比 CNN 来说,速度可能会慢,但可以节省更多的内存空间. 初始化 首先我们可以先初始化一些变量,如学习率.节点单元数 ...

  6. Linux之网络管理

    一.网络基础 1)ISO/OSI七层模型简介 ISO:国际标准化组织 OSI:开放系统互联模型 IOS:苹果操作系统(在计算机网络中,IOS是互联网操作系统,是思科公司为其网络设备开发的操作维护系统) ...

  7. js常见排序

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  8. 【SDOI2009】HH的项链 (莫队)

    题面 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的 ...

  9. LightOJ1245 Harmonic Number (II)

    题意 \(求\Sigma \lfloor \frac{n}{i} \rfloor\) Input starts with an integer T (≤ 1000), denoting the num ...

  10. 关系型数据库工作原理-SQL重写(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...