2023 年 4月5日
目录
一.逻辑结构![](https://i-blog.csdnimg.cn/blog_migrate/a081d6db172fa7cd6083a3e7f4c3bf81.jpeg)
二.树型结构(非线性结构 一对多)
-
节点之间有分支
-
具有层次关系 使用范围
三.树的定义
树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:
- 有且仅有一个特定的称为根的结点。
- 当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
五. 结点
1.树的节点包括一个数据元素及若干指向其子树的分支。
(1)除结点拥有子树数的称为结点的度。
(2) 度为0的结点称为叶结点或终端结点;度不为0的称为非终端结点或分支结点。
(3)除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值
(4)结点的树的子树的根称为该结点的孩子,反正这个结点是孩子的双亲结点,同一个双亲
结点的关系就是兄弟,以某结点为根的子树中的任意一个结点都称为该节点的子孙,反之祖宗。
六,树的基本术语
上面总结用一些基本术语来形容
1.森林:是m(m>=0)棵互不相交的树的集合 ` 注意树一定是森林,森林不一定是树`
2.结点(node): 树的结点由数据元素及其若干分支组成
3.子树:以根结点为根的树为全树(或树),以其他结点作为根结点的树为子数
4.结点的度:该结点分支数量
5.树的度:树中所有结点的度的最大值
6.叶子结点(leaf node):无分支的结点
7.双亲结点、孩子结点:一个结点下的所有分支结点称为孩子结点,该结点成为他们的双亲结点。
8.兄弟结点:具有共同的双亲
9.堂兄弟:在同一层,具有公共祖先
10.树的深度、高度:深度:根节点从0开始计算,高度:最底层结点从0开始计算
七.二叉树、
1.二叉树的定义及注意事项
是一种看似特别的一种树类型
实际是一种高度定义的树,所以二叉树是树的一种特殊情况时错误的说法
二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树( 即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒
与树相似,二叉树也以递归的形式定义。二叉树是n (n≥0) 个结点的有限集合:
2,遍历二叉树
每个都首先需要判断树是否为空
(1)先序遍历
先访问根结点
先序遍历左子树
先序遍历右子树
(2)中序遍历
中序遍历左子树
访问根结点
中序遍历右子树
(3)后序遍历
后序遍历左子树
后序遍历右子树
访问根结点
二叉树的节点定义
typedef struct Node
{
char data;//数据域
struct Node *lchild ,*rchild;//左子树和右子树
}
查找操作
/*
递归查找二叉排序树T中是否存在key
指针f指向T的双亲,其初始调用值为NULL
若查找成功,则指针p指向该数据元素结点,并返回TRUE
否则指针p指向查找路径上访问的最后一个结点并返回FALSE
*/
bool SearchBST(Node T, int key, BiTree f, BiTree *p){
if(!T){
*p = f;
return FALSE;
}else if(key == T->data){
//查找成功
*p = T;
return TRUE;
}else if(key < T->data){
return SearchBST(T->lchild, key, T, p); //在左子树继续查找
}else{
return SearchBST(T->rchild, key, T, p); //在右子树继续查找
}
}
插入操作
/*
当二叉排序树T中不存在关键字等于key的数据元素时
插入key并返回TRUE,否则返回FALSE
*/
bool InsertBST(Node *T, int key){
BiTree p, s;
if(!SearchBST(*T, key, NULL, &p)){
//查找不成功
s = (Node)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = s->rchild = NULL;
if(!p){
*T = s; //插入s为新的根节点
}else if(key < p->data){
p->lchild = s; //插入s为左孩子
}else{
p->rchild = s; //插入s为右孩子
}
return TRUE;
}else{
return FALSE; //树种已有关键字相同的结点,不再插入
}
}