数据结构-树(二叉树)

树形结构:
一对多概念:
除了根节点以外,其它所有节点都只有一个前驱节点可以有多个后继节点
叶子节点:只有前驱节点,没有后继节点
其它的节点都叫做分支节点
深度:描述树形结构分了多少层
广度:每一个后继节点的个数
一个树中某个节点的后继节点的个数最多则称之为这个树的广度
森林: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;
二叉树的销毁
先销毁左子树再销毁右子树最后销毁根(如果为空则结束)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值