数据结构(三)-- 二叉树

树: 一种非线性结构,因为整体结构形似一颗倒挂的的树,所以称该结构为树;
树的逻辑结构示意图:
在这里插入图片描述
上图中 F节点被称为根节点 他的左子树是以C为根节点的树结构,他的右子树是以E为根节点的树结构。所以称C为F的左孩子,E为F的右孩子;
树的基本概念:
节点的度: 节点含有子树的个数称为该节点的度
叶子:没有孩子的节点
双亲: 有孩子的节点
树的度: 所有节点的度中最大的一个
树的高度: 树的最深层次数
森林 : n棵互不相交的树的集合
树的表示: 树的表示方法有双亲表示法,孩子表示法, 孩子兄弟表示法等等,
二叉树:
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树
的二叉树组成。
二叉树的特点:
左右子树存在顺序之分,不能颠倒;
一个节点最多只有两条边;
特殊的二叉树结构
完全二叉树:
假定有k层,则除了第k层,其余每一层的节点数都为:(2^n) - 1个节点(n表示层数,层数从1开始);
第k层的最后一个节点左边不能存在空节点;
满二叉树:
假定有k层,每一层的节点数都为:(2^n) - 1个节点(n表示层数,层数从1开始);
是一种特殊的完全二叉树结构;
对应完全二叉树有以下性质:
假定有k层,则除了第k层,其余每一层的节点数都为:2^( n - 1)个节点(n表示层数,层数从1开始);
如果是满二叉树,对应深度为k时,节点个数为:2^(n) - 1;
对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
于序号为i的结点有:
1.若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
2. 若2i+1,左孩子序号:2i+1,2i+1>=n否则无左孩子
3.若2i+2,右孩子序号:2i+2,2i+2>=n否则无右孩子
以Ni表示度为i的节点个数
树的节点总数 N = N0 + N1 + N2;
按照边的角度来看 :节点为N的树存在 N - 1条边
则有: N - 1 = N1 + N22;
则总数 N1 + N2
2 + 1 = N0 + N1 + N2; 可知 2*N2 + 1 = N0;
实现二叉树:
如果采用顺序存储实现的话对于非完全二叉树可能会导致大量的空间浪费,所以这里采用链式存储实现二叉树;
二叉树节点的表示(二叉链表示):

typedef struct BTNode {
        BTData _data;
        struct BTNode* right;
        struct BTNode* _left;
}BTNode;

树的遍历:
前序遍历: 采用根->左子树->右子树的方式循环遍历
中序遍历: 采用左子树-> 根 -> 右子树的方式循环遍历
后序遍历; 采用左子树-> 右子树-> 根的方式循环遍历
二叉树结构—堆:
特点:必须是完全二叉树;
如果是大根堆,则父节点的值大于孩子及以孩子为根的子树之中所有节点的值,小根堆则反之
实现: 因为堆是完全二叉树结构所以使用顺序存储来构建更加合适
向下调整算法:
现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整
成一个大堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整,所以由下向上采用算法,
如图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在交换完1、8之后,堆结构被破坏,需要递归去重新构造

在这里插入图片描述

建成大堆在这里插入图片描述
堆的插入:
将元素放到最后一个位置后,进行与向下调整相反的向上调整,知道满足堆的结构;
堆的删除
将根元素与最后一个元素互换位置,删除最后一个元素,再将根元素进行向下调整

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值