树 二叉树

2023 年  4月5日

目录

一.逻辑结构​编辑

 二.树型结构(非线性结构 一对多)

三.树的定义

五. 结点

六,树的基本术语

七.二叉树、

(1)先序遍历

(2)中序遍历

(3)后序遍历

二叉树的节点定义

查找操作

插入操作

 


一.逻辑结构

 二.树型结构(非线性结构 一对多)

  1. 节点之间有分支

  2. 具有层次关系 使用范围

三.树的定义

 树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:

  1. 有且仅有一个特定的称为根的结点。
  2. 当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;	//树种已有关键字相同的结点,不再插入
		}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值