数据结构

本文介绍了几种常见的数据结构。栈是特殊线性表,插入和删除在同一端;队列在一端插入、另一端删除。树由众多节点组成,有根节点和子树。二叉树每个节点最多两个分支,查找速度快。还介绍了堆的结构及put、get操作的实现过程。

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

数据结构有栈,队列,树及二叉树

栈:

栈是一种只能在某一端插入和删除的特殊线性表。可以删除与插入的一端称为栈顶,另一边则是栈底,因为其插入与删除在同一端,顾先插入的晚删除。

插入函数:push,插在栈顶一个元素

删除函数(只能删除栈顶):pop,一般要检测栈中内容是否为空

在c++stl中有一种专门的容器,称为queue,在一定程度上我认为是一个栈,但又不能说是完全的栈,更应该说是队列,那么介绍一下队列:

队列也是在一端插入,但是删除确实进行在另一端,队列的删除和插入分别称为出队和入队。允许出队的一端称为队头,允许入队的一端称为队尾,所以总是先入队的元素先删除,与恰好相反。

队列可以用数组q[m+1]来存储,数组上界m既是队列所容许的最大容量。在队列的运算中须设两个指针:

head:队头指针,指向实际队头元素的前一个位置。

tail:队尾指针,指向实际队尾元素所在的位置。

一般入队算法如下:

1. tail=tail+1;

2.若tail=n+1,则tail=1

3.若head=tail尾指针与头指针重合了,表示元素已装满队列,则作上溢出错处理

4.否则q[tail]=x,结束(x为新入元素)

树,二叉树

树是一种由众多节点组成的集合,既一个节点有许多分叉,然后分叉通向一个节点,再分叉。

每个数数据结构都有一个根节点,所有的分叉都源于这一个节点。

除了根节点以外,其余节点可以有许多分叉,组成一颗子树。

一个节点的子树个数,称为这个节点的度;度为0的节点称为叶节点。度不是0的节点称为分支节点。

在一般数据中,数据排列是从上往下分支,则上端节点称为下端节点的父节点,下端节点称为上端节点的子节点。根结点是所有节点的祖先,而所有节点又是根节点的祖孙~

树的遍历:

a.先序遍历:先访问根节点,在从左到右按照先序思想遍历各棵子树。

b.后序遍历:先从左到右遍历各棵子树,在访问根节点。

c.层次遍历:按层次从小到大逐个访问,同一层次按照从左到右的次序,类似于广搜。

二叉树:

与树有一点不同,就是二叉树每个节点只有两个分支,其一般是有序的,既左边的分支数比节点小,右边的分支数比节点大,所有其寻找数的速度是log2(n),能够快速的寻找。

二叉树叶结点数为n0,度为2的结点数为n2,一定满足:n0=n2+1

具有n个结点的完全二叉树的深度为floor(log2n)+1

二叉树遍历方法:

若二叉树为空则进行空操作,否则:

   1.访问根结点 

 2.先序遍历左子树   

  3.先序遍历右子树

堆:

堆的结构是一种数组对象,可以视为是完全二叉树。树的每个结点与数组中存放该结点里值的那个元素相对应。

堆一般有两个操作,一个是put,既往堆里添加一个数据,一个是get,即从堆里取出一个数据。

put操作的实现过程:

将一个新数据放在堆的最底部,然后其与父节点相比较,若大于父节点则与父节点交换位置,这样的特性使得堆在整体上虽然没有得到排序,但是却可以保证根节点确实整组数据中的最大值。

代码实现:

void put(int d)     //heap[1]为堆顶

{     int now, next;    //now当前节点,next为父节点,用于比较

 heap[++heap_size] = d;   //将新数据放在队尾,在放之前将size+1

 now = heap_size;  

   while(now > 1)     {

        next = now >> 1;  

       if(heap[now] >= heap[next]) break;   

     swap(heap[now], heap[next]);      

   now = next;     } }

get操作实现过程:

get一般是取出根节点的值,那么根节点就空出来了,这个地方需要注意,根节点空出来的位置是由最后那一个数据填充的,然后再由根节点也就是最后那个数据与根节点的子字节相比较,然后大的放在上面,逐层交换,最后得到一个新的堆。

代码实现:

int get() //heap[1]为堆顶

{     int now=1, next, res= heap[1];     //now代表当前节点,next代表其父节点,用于比较

 heap[1] = heap[heap_size--];     //将最后一个值放在根节点,同时使size减一

while(now * 2 <= heap_size)     //这说明当前节点未循环完毕

 {         next = now * 2;   

     if (next < heap_size && heap[next + 1] < heap[next]) next++;     

    if (heap[now] <= heap[next]) break;   

     swap(heap[now], heap[next]);         

now = next;     }

    return res; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值