数据结构:二叉树

数据结构分为两种:

表示型和存储型,树就是表示型,表示某种结构

树的概念

树是一种非线性的数据结构,它是由n个有限结点组成的一个具有层次关系的集合

它有一个特殊的结点,叫做根节点,根节点没有前驱结点

除根节点外,其余的结点被分为M(M>0)个互不相交的集合(T1,T2......Tm),其中每一个集合Ti(1<=i<=m)又是一棵结构与树类似的子树,每棵子树的根结点有且仅有一个前驱,可以有0个或多个后续

因此,树是递归定义的

注意:

树形结构中,子树之间不能由交集,否则就不是树形结构

eg.

树的相关概念

节点的度:一个节点含有的子树的个数称为该节点的度(上图中的A的度为6)

叶节点(终端节点):度为0的节点称为叶节点

分支节点:度不为0的节点

双亲节点(父节点):若一个节点含有子节点,则这个节点称为其子节点的父节点

孩子节点(子节点):一个节点含有的字数的根节点称为该节点的子节点

兄弟节点:具有相同父节点的节点互称为兄弟节点

树的高度:树中节点的最大层次

节点的祖先:从根节点到该节点所经分支上的所有节点

子孙:以某节点为根的子树中任一节点都称为该节点的子孙

总边数与度之间的关系为:n-1(总边数)=0*n0+1*n1+2*n2+3*n3.(ni表示度为i的节点的个数)

树的拆分

任何一棵树都会被拆分为根和子树,直到将所有子树拆分完.

树的表示

左孩子右兄弟表示法

//第一种
struct TreeNode
{
    int val;
    //定义顺序表存储子树
    struct TreeNode** subA;//一个指针数组
    int size;
    int capacity;
};
//第二种
//左孩子,右兄弟
//不管有几个子树,第一个指针都只指向第一个子树,第二个指针指向相邻的兄弟
struct TreeNode
{
    int val;
    struct TreeNode* leftChild;
    struct TreeNode* nextBrother;
};

第二种树如下图:

双亲表示法

物理结构(在内存中如何存储):数组(数组存储父亲的下标)(没有父亲就存-1)

逻辑结构:森林

eg.

二叉树的概念及结构

二叉树的概念

一棵二叉树是节点的有限集合,该集合:

1.或者为空

2.由一个根节点加上两棵别称为左子树和右子树的二叉树组成

二叉树的一个节点最多有两个子树(0~2个)

二叉树的子树有左右之分,次序不能颠倒

二叉树单纯存储数据没有太大价值,不如链表和顺序表,他的优点在于"搜索二叉树"

二叉树的应用

搜索二叉树:

1.存储数据

2.搜索数据

数据特点:左子树<根<右子树

查找最多进行"高度次"

但是搜索二叉树存在问题,树可能退化:

特殊的二叉树

1.满二叉树

前n-1层全满,每一个节点的度都是2,叶子节点都在最后一层

2.完全二叉树

前n-1层全满,最后一层不一定满,但要求从左到右的节点是连续的

完全二叉树的顺序存储:

物理结构:数组

逻辑结构:二叉树

完全二叉树的父子间存储的下标位置规律:

leftchild = parent*2 + 1

rightchild = parent*2 + 2

parent = (child - 1)/2

为防止空间浪费,数组存储只适合完全二叉树和满二叉树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值