树形结构:
一对多概念:
除了根节点以外,其它所有节点都只有一个前驱节点可以有多个后继节点
叶子节点:只有前驱节点,没有后继节点
其它的节点都叫做分支节点
深度:描述树形结构分了多少层
广度:每一个后继节点的个数
一个树中某个节点的后继节点的个数最多则称之为这个树的广度
森林:n个互不相交的树的集合
二叉树:
每一个节点的子节点个数不能超过两个
且子节点的位置不能更改(二叉树分左右)
左子节点和右子节点
满二叉树:所有的叶子节点都处在同一层,且所有节点的度都为2
满二叉树第k层有2的k-1次方个节点
k层的满二叉树总共有2的k次方-1个节点
完全二叉树:(是由满二叉树引出来的)自右向左,自下而上删(只是删除了满二叉树最底层最右边的若干个节点)
假设二叉树的深度为k,除了第k层外,其它各层数的节点数都达到最大个数(0->k-1为一个满二叉树)
第k层的所有节点都连续的集中在最左边 堆一般都是都是用完全二叉树来实现的
满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树
二叉树的遍历
1.前序遍历 根 左子树 右子树
2.中序遍历 左子树 根 右子树
3.后序遍历 左子树 右子树 根
4.层序遍历 自上而下,自左向右依次遍历 1.2.3.为深度优先的遍历算法
4.为广度优先的遍历算法
前序+中序 和 中序+后序 才能唯一的还原出来一条二叉树
只知道一个序列无法展开扩展为扩展二叉树 展开是可以给叶子节点引出左右节点(赋予一个特殊符号eg:#)
二叉树节点结构体
1.pL指向左子节点
2.数据
3.pR指向右子节点
二叉树代码切记递归思想!
1.创建二叉树 返回二叉树节点指针
2.判断是否为空
3.利用递归的思想开始前中后序遍历并打印节点数据
层序遍历的难点在于ABC访问完后又要回到左子树来访问B的D和E,又回到C访问G
始终需要一个结构把每次需要访问的数据保存起来(保存节点保存的是节点地址) 因为先保存进去的先出来所以需要使用到队列
1.创建队列
2.入队
3.判断只要队列不为空时进入循环
1.让节点出队 打印所含字符
2.判断左右节点是否为空,不为空则入队
获取节点数的个数
1.判断是否为空
2.不是空
return 1+getBTNodeCnt(pRoot>pL)
+getBTNodeCnt(pRoot->pR)
统计二叉树的层数
1.判断是否为空(递归的出口)
2.判断左子树和右子树层,谁多返回谁+1 int cntl = getBTLayerCnt(pRoot->pL);
int cntR = getBTLayerCnt(pRoot->pR);
return cntl > cntR ? cntl+1:cntR+1;
二叉树的销毁
先销毁左子树再销毁右子树最后销毁根(如果为空则结束)
数据结构——二叉树
最新推荐文章于 2024-11-13 16:35:03 发布
本文详细讲解了树形结构的一对多概念,区分了叶子节点和分支节点,并介绍了深度与广度的概念。特别聚焦于二叉树,包括其定义、节点结构、遍历方法(前序、中序、后序及层序),以及满二叉树和完全二叉树的区别。此外,还涵盖了二叉树的节点操作、节点个数计算、层数统计以及销毁方法。
摘要由CSDN通过智能技术生成