新手精通数据结构——二叉树

本文详细介绍了二叉树的概念、特点、分类,包括完全二叉树和满二叉树的区别。深入探讨了二叉树的性质,如层节点数、结点关系等。并讲解了如何用顺序表实现二叉树,特别是堆的创建、插入和删除操作,为后续的堆排序等算法打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新手精通数据结构——二叉树

二叉树

概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
二叉树的特点:

  1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒。
    在这里插入图片描述
    二叉树的分类
    完全二叉树,满二叉树。
    **满二叉树:**一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
    说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
    完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K
    的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对
    应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

满二叉树
在这里插入图片描述
完全二叉树
在这里插入图片描述
总而言之满二叉树是特殊的完全二叉树。完全二叉树是:可以不满,但不能不连续。

二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h- 1.
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=Log2(n+1). (ps:Log2(n+1)是log以2为
    底,n+1为对数)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
    于序号为i的结点有:
  6. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点。
  7. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子。
  8. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子。

怎么实现二叉树呢?
用链表还是顺序表?
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
要搞清楚逻辑结构和存储结构哦。

物理结构:
在这里插入图片描述
物理结构

在这里插入图片描述
链式结构我们先不讲,主要还是用顺序表实现。

数据表结构中的就是一个完全二叉树。
实现堆就是实现了一个二叉树。
堆有大堆小堆
大堆:根永远比子节点大的堆(但是不一定有序)
小堆:根永远比子节点小的堆(但是不一定有序)
在这里插入图片描述
大堆类似就不展示了。

实现一个堆:

堆向下调整算法

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整
成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

堆的创建

下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算
法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的
子树开始调整,一直调整到根节点的树,就可以调整成堆。int a[] = {1,5,3,8,7,6};
在这里插入图片描述
这是一个小堆,我们要把它向上调整为大堆。
在这里插入图片描述
在这里插入图片描述

堆的插入

先插入一个80到数组的尾上,再进行向上调整算法,直到满足堆。
在这里插入图片描述

在这里插入图片描述

堆的删除

删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。(不删除堆顶,那就没啥意思了)

在这里插入图片描述

代码的实现

Tree.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>
typedef int HPDataType;
typedef struct Heap
{
   
   
	HPDataType* a;
	int size;
	int capacity;
}HP;

void HeapInit(HP* hp);
void HeapDestroy(HP* hp);
void HeapPush(HP* hp,HPDataType x)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tom王要coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值