第30课 - 树的定义

1. 定义

树是一种非线性的数据结构,树是由n(>=0)个结点组成的有限集合。

如果n = 0,称为空树;

如果n > 0,则有一个称之为根(root)的结点,它只有直接后继,但是没有直接前驱;除了根以外其他的结点划分为m(m>=0)个互不相交的有限集合T0,T1,T2,...,Tm-1。每一个集合又是一棵树,并且称之为根的子树(subTree)。

2. 树家族中的概念

(1)      树的结点包含一个数据以及若干指向子树的分支。

(2)      结点拥有的字树数称为结点的度:度为0的结点称为叶结点,度不为0的结点称之为分支节点。

(3)      树的度定义为所有结点中的度的最大值。

(4)      结点的直接后继称为该结点的孩子,相应的,该结点称为孩子的双亲。

(5)      结点的孩子的孩子的……称为该结点的子孙,相应的该结点称为子孙的祖先。

(6)      同一个双亲的孩子之间互称兄弟。

(7)      结点的层次:根为第一层,跟的孩子为第二层。

(8)      树中结点的最大层次称为树的深度或者高度。

(9)      如果树中结点的各子树从左向右是有次序的,子树间不能互换位置,则称该树为有序树,否则为,否则为无序树。

(10)   森林是由 n ( n>= 0 ) 棵互不相交的树组成的集合。

3. 树的操作

(1)      创建树

(2)      销毁树

(3)      清空树

(4)      插入结点

(5)      删除结点

(6)      获取结点

(7)      获取根结点

(8)      获取树的结点数

(9)      获取树的高度

(10)   获取树的度

4. 操作的实现

l  树在程序中表现为一种特殊的数据类型。

l  树的操作在程序中的表现为一组函数。

Tree* Tree_Create();

void Tree_Destroy(Tree* tree);

void Tree_Clear(Tree* tree);

int Tree_Insert(Tree* tree, TreeNode* node, int pos);

TreeNode* Tree_Delete(Tree* tree, int pos);

TreeNode* Tree_Get(Tree* tree, int pos);

TreeNode* Tree_Root(Tree* tree);

int Tree_Height(Tree* tree);

int Tree_Count(Tree* tree);

int Tree_Degree(Tree* tree);

5. 手写代码

main.c

#include <stdio.h>

#include <stdlib.h>

#include "Tree.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[])

{

Tree* tree = Tree_Create();

Tree_Destroy(tree);

return 0;

}

Tree.h

#ifndef _TREE_H_

#define _TREE_H_

typedef void Tree;

typedef void TreeNode;

/* 创建树 */

Tree* Tree_Create();

/* 销毁已存在的树 */

void Tree_Destroy(Tree* tree);

/* 将已存在的树清空为空树 */

void Tree_Clear(Tree* tree);

/* 将结点node插入到tree中的pos位置处 */

int Tree_Insert(Tree* tree, TreeNode* node, int pos);

/* 将tree中pos位置的结点删除并返回 */

TreeNode* Tree_Delete(Tree* tree, int pos);

/* 将tree中pos位置的结点返回 */

TreeNode* Tree_Get(Tree* tree, int pos);

/* 返回tree的根结点 */

TreeNode* Tree_Root(Tree* tree);

/* 返回tree的高度 */

int Tree_Height(Tree* tree);

/* 返回树的结点数 */

int Tree_Count(Tree* tree);

/* 返回树的度数 */

int Tree_Degree(Tree* tree);

#endif

Tree.c

#include <stdio.h>

#include "Tree.h"

Tree* Tree_Create()

{

return NULL;

}

void Tree_Destroy(Tree* tree)

{

}

void Tree_Clear(Tree* tree)

{

}

int Tree_Insert(Tree* tree, TreeNode* node, int pos)

{

return 0;

}

TreeNode* Tree_Delete(Tree* tree, int pos)

{

return NULL;

}

TreeNode* Tree_Get(Tree* tree, int pos)

{

return NULL;

}

TreeNode* Tree_Root(Tree* tree)

{

return NULL;

}

int Tree_Height(Tree* tree)

{

return 0;

}

int Tree_Count(Tree* tree)

{

return 0;

}

int Tree_Degree(Tree* tree)

{

return 0;

}

6. 小结

线性结构

树结构

l  第一个结点:无前驱

l  最后一个结点:无后继

l  中间结点:一个前驱和一个后继

l  根节点:无双亲

l  叶结点:无后继

l  中间结点:一个前驱和多个后继

在一些情况下,线性结构可看作特殊的树结构。

转载于:https://www.cnblogs.com/free-1122/p/11336025.html

数据--第30课 - 树的定义相关推荐

  1. python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验

    知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...

  2. C语言-第30课 - 程序中的三国天下

    第30课 - 程序中的三国天下 一. 概念 内存基本构成     可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同.     静态存储区:内存在程序 ...

  3. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...

  4. 数据结构(十八)树的定义与存储结构

    一.树的定义 1.树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点:(2)当n>1时,其余结点可分为m( ...

  5. 二叉树第i层中的所有结点_讲透学烂二叉树(二):图中树的定义amp;各类型树的特征分析...

    日常中我们见到的二叉树应用有,Java集合中的TreeSet和TreeMap,C++ STL中的set.map,以及Linux虚拟内存的管理,以及B-Tree,B+-Tree在文件系统,都是通过红黑树 ...

  6. window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“

    第十四课,学习定义方法.一个对象包含三种最常见的成员:构造器.Field和方法.Field用于定义状态数据,而方法是行为特征的抽象. 那么什么是方法呢? 在Java中,方法就是用来完成解决某件事情或实 ...

  7. 数据结构之树的定义及操作

    树的定义 树是一种非线性的数据结构 树是由 n ( n ≥0 ) 个结点组成的有限集合 如果 n = 0,称为空树(如下图a): 如果 n > 0,则: 1.有一个特定的称之为根(root)的结 ...

  8. iphone ipad等苹果设备30针数据线接口定义,大家可能有用

    原文地址::http://wenku.baidu.com/view/0afc1cfb910ef12d2af9e781.html 相关网帖 1.iphone数据线接口定义----http://wenku ...

  9. 数据泄漏防御DLP的确切定义

    数据泄漏防御DLP的确切定义 数据安全中的数据泄漏防御(DLP)是个常被误解的术语.由于这个领域有着很多的需求,很多公司自夸自己拥有DLP功能,其实它们根本就和DLP扯不上边.分析师也常被搞糊涂了.我 ...

  10. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

最新文章

  1. javascript功能_功能性JavaScript简介
  2. GeoTrust 企业(OV)型 SSL证书
  3. JDK、JRE、JVM三者间的关系
  4. 常用的正则表达式---学习笔记(一)
  5. html header文件格式类
  6. C/C++:uint64_t 转为char*
  7. 【Lolttery】项目开发日志 (七)socket io 结合 react js实现简单聊天室
  8. Dom4j 读取一个XML文件和将String写成XML文件
  9. Docker容器解决没有Vim命令
  10. linux delete快捷键,Linux 常用快捷键
  11. sublime text3怎么运行python代码_Sublime Text3配置在可交互环境下运行python快捷键
  12. VBS教程---第一篇
  13. OpenCV IplImage图片结构
  14. 开发规约:接口统一返回值格式 [resend]
  15. 计算方法(三)平方根法及其改进解线性方程组
  16. 【爱码物联】“颜值经济”当道,你选的化妆品能溯源么?
  17. mybatis缓存的使用及理解
  18. 分享一个好用的在线加解密工具
  19. 数据治理:数据治理框架和标准
  20. Matlab-梁单元有限元分析(有限元基础-曾攀)

热门文章

  1. vue mysql交互_几种vue的数据交互形式
  2. 卧槽,又来一个 Java 神器!!
  3. 最牛逼android上的图表库MpChart(二) 折线图
  4. java string对象,java中String对象
  5. php ci框架开发手册,CodeIgniter 教程 - php CodeIgniter 框架 - CodeIgniter手册
  6. html添加兄弟元素,jquery插入兄弟节点的操作方法
  7. python 指定时间内_python获取指定时间段内的随机不重复的时间点
  8. mariadb.zip压缩包解压后使用绿色db配置方法
  9. 带有参数的输出存储过程
  10. android 监听通知栏点击事件,android使用NotificationListenerService监听通知栏消息