第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 中间结点:一个前驱和多个后继 |
在一些情况下,线性结构可看作特殊的树结构。