树形结构C语言的实现
创作时间:
作者:
@小白创作中心
树形结构C语言的实现
引用
CSDN
1.
https://blog.csdn.net/2301_81689298/article/details/140215886
树形结构是一层次的嵌套结构。一个树形结构的外层和内层有相似的结构,所以这种结构多可以递归的表示。经典数据结构中的各种树状图是一种典型的树形结构:一棵树可以简单的表示为根,左子树,右子树。左子树和右子树又有自己的子树。
一.什么是树:
树形结构是一层次的嵌套结构。一个树形结构的外层和内层有相似的结构,所以这种结构多可以递归的表示。经典数据结构中的各种树状图是一种典型的树形结构:一棵树可以简单的表示为根,左子树,右子树。左子树和右子树又有自己的子树。
树的一些属性:
- 结点(Node):表示树中的数据元素,由数据项和数据元素之间的关系组成。在图中,共有10个结点。
- 结点的度(Degree of Node):结点所拥有的子树的个数,在图中,结点A的度为3。
- 树的度(Degree of Tree):树中各结点度的最大值。在图5.1中,树的度为3。
- 叶子结点(Leaf Node):度为0的结点,也叫终端结点。在图5.1中,结点E、F、G、H、I、J都是叶子结点。
- 分支结点(Branch Node):度不为0的结点,也叫非终端结点或内部结点。在图5.1中,结点A、B、C、D是分支结点。
- 孩子(Child):结点子树的根。在图中,结点B、C、D是结点A的孩子。
- 双亲(Parent):结点的上层结点叫该结点的双亲。在图中,结点B、C、D的双亲是结点A。
- 祖先(Ancestor):从根到该结点所经分支上的所有结点。在图中,结点E的祖先是A和B。
- 子孙(Descendant):以某结点为根的子树中的任一结点。在图中,除A之外的所有结点都是A的子孙。
- 兄弟(Brother):同一双亲的孩子。在图5.1中,结点B、C、D互为兄弟。
- 结点的层次(Level of Node):从根结点到树中某结点所经路径上的分支数称为该结点的层次。根结点的层次规定为1,其余结点的层次等于其双亲结点的层次加1。 [1]
- 堂兄弟(Sibling):同一层的双亲不同的结点。在图中,G和H互为堂兄弟。
- 树的深度(Depth of Tree):树中结点的最大层次数。在图5.1中,树的深度为3。 [1]
- 无序树(Unordered Tree):树中任意一个结点的各孩子结点之间的次序构成无关紧要的树。通常树指无序树。 [1]
- 有序树(Ordered Tree):树中任意一个结点的各孩子结点有严格排列次序的树。二叉树是有序树,因为二叉树中每个孩子结点都确切定义为是该结点的左孩子结点还是右孩子结点。 [1]
- 森林(Forest):m(m≥0)棵树的集合。自然界中的树和森林的概念差别很大,但在数据结构中树和森林的概念差别很小。从定义可知,一棵树由根结点和m个子树构成,若把树的根结点删除,则树变成了包含m棵树的森林。当然,根据定义,一棵树也可以称为森林。
一些特殊的树:
树中最特殊最经典的就是二叉树,二叉树顾名思义就是只有两个分叉的树,也就是度为二的树。
二叉树中又有俩个最为经典的树分别为完全二叉树和满二叉树。
一棵深度为k且有2^k-1个结点的二叉树称为满二叉树。
如果对满二叉树的结点进行编号, 约定编号从根结点起, 自上而下, 自左而右。则深度为k的, 有n个结点的二叉树, 当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时, 称之为完全二叉树。
二.用c语言实现一颗树:
要实现一颗树我们首先要先定义一个树的结构体
然后要确定我们树的基本功能
接着就是写完这些函数
#include"BinaryTree.h"
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{
if (a[*pi] == '#')
{
(*pi)++;
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->data = a[(*pi)++];
root->left = BinaryTreeCreate(a, pi);
root->right = BinaryTreeCreate(a, pi);
return root;
}
void BinaryTreeDestory(BTNode* root)
{
assert(root);
if (root == NULL)
return;
BinaryTreeDestory(root->right);
BinaryTreeDestory(root->left);
free(root);
root = NULL;
}
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
return 0;
return BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}
int BinaryTreeLeafSize(BTNode* root)
{
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return 1;
return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}
int BinaryTreeLevelKSize(BTNode* root, int k)
{
if (root == NULL)
return 0;
if (k == 1)
return 1;
k--;
return BinaryTreeLevelKSize(root->left,k) + BinaryTreeLevelKSize(root->right,k);
}
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
return NULL;
if (root->data == x)
return root;
BTNode* leftfind = BinaryTreeFind(root->left, x);
if (leftfind != NULL)
return leftfind;
BTNode* rightfind = BinaryTreeFind(root->right, x);
if (rightfind != NULL)
return rightfind;
return NULL;
}
void BinaryTreePrevOrder(BTNode* root)
{
if (root)
{
printf("%c", root->data);
BinaryTreePrevOrder(root->left);
BinaryTreePrevOrder(root->right);
}
}
void BinaryTreeInOrder(BTNode* root)
{
if (root)
{
BinaryTreeInOrder(root->left);
printf("%c", root->data);
BinaryTreeInOrder(root->right);
}
}
void BinaryTreePostOrder(BTNode* root)
{
if (root)
{
BinaryTreePostOrder(root->left);
BinaryTreePostOrder(root->right);
printf("%c", root->data);
}
}
热门推荐
西安情侣旅游攻略:入冬3日游,古城浪漫之旅
2025年汽车年检大变天!OBD检测来袭,车主必看攻略
OBD系统上线,二手车市场遭遇“透明化”挑战
6年免检新政解读:哪些车能免?如何申领?注意事项全攻略
上海车主必看!年检新变化揭秘
如何预防心脏病?这九个方法一定要记牢
《猪猪侠之竞速小英雄9》新预告来袭!超星车队全员集结,西大陆冒险即将开启
牙科医生推荐:如何通过饮食保护牙齿?
健身房打卡,你的牙齿也受益!
坚持开合跳有什么好处?每天500个开合跳,能消耗多少卡路里?
春节爆款指南:新年头像穿搭推荐
新年微信头像拍摄秘籍!
入选乡村生态气候旅游目的地,龙泉这两个宝藏小村藏不住啦!
浙江版"大鱼海棠":龙泉源底村的义仓与古建之美
大理古城秋冬绝美拍摄攻略:银杏、樱花与古建的完美融合
巢湖银鱼:合肥特产中的“鱼类皇后”
肥东杭椒:从田间到餐桌的品牌之路
高质量陪伴:如何通过日常小事增进亲子关系?
专家支招:4个实用技巧化解亲子冲突
如何化解亲子冲突?这六个步骤帮你搞定!
2024年江苏高考:稳录南航北航攻略
正确跑步姿势助你在比赛中领先!
青鱼石装饰品防开裂小妙招
2025《辽视春晚》又要整活玩跨界?网友的脑子都快不够用了
洗牙后如何避免牙齿酸软?这6招超实用!
牙科医师刘馥萱:通过饮食改善牙齿酸软的实用指南
牙本质过敏,你真的了解吗?
营养补充能缓解牙齿酸软吗?专家解读关键营养素
发黑的香蕉别扔!这些妙用让你省下不少钱
苹果官方推荐:如何正确使用手机电池