数据结构 # 二叉树/堆/栈

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

逻辑结构包括:
1.集合
数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;

2.线性结构
数据结构中的元素存在一对一的相互关系;

3.树形结构
数据结构中的元素存在一对多的相互关系;

4.图形结构
数据结构中的元素存在多对多的相互关系。

================

效果:1、对于,数据结构、堆栈的简单总结。2、链表的操作!

> 数据结构

 

  • > 自引用结构
  • struct list {
  • int          data;
  • struct list  *next;
  • } a;
  • > 线性链表
  • list.h:
  • #include <stdio.h>
  • #include <stdlib.h>
  • typedef char DATA;          /* will use char in examples. */
  • struct linked_list {
  • DATA                d;
  • struct linked_list  *next;
  • };
  • typedef struct linked_list  ELEMENT;
  • typedef ELEMENT             *LINK;
  • > 链表操作
  • #include "list.h"
  • #include <stdlib.h>
  • LINK string_to_list(char s[])
  • {
  • LINK        head;
  • if (s[0] == ‘\0‘)       /* base case. */
  • return NULL;
  • else {
  • head = malloc(sizeof(ELEMENT));
  • head -> d = s[0];
  • head -> next = string_to_list(s+1);
  • return head;
  • }
  • }
  • * 插入(insert)
  • /* Inserting an element in a linked list. */
  • void insert(LINK p1, LINK p2, LINK q)
  • {
  • assert(p1 -> next == p2);
  • p1 -> next = q;             /* insert */
  • q -> next = p2;
  • }
  • * 删除(delete)
  • /* Recursive deletion of a list. */
  • void delete_list(LINK head)
  • {
  • if (head != NULL) {
  • delete_list(head -> next);
  • free(head);             /* release storage */
  • }
  • }

> 堆栈 

  • 堆栈(压入、弹出)
  • 堆栈、是暂时存放数据和地址,通常用来保护断点和现场;
  • 堆,队列优先,先进先出(First-In/First-Out);
  • 栈,先进后出(First-In/Last-Out)。
  • ADT Stack(堆栈)
  • 1、只能在一端(称为栈顶(top))对数据项进行插入和删除
  • 2、push(压入==增)、pop(弹出==删)、top(取顶部元素==查)、empty(判断是否为空)、full(判断是否已满)和reset(重置==init)

================

|--> Copyright (c) 2015 Bing Ma.

|--> GitHub RUL: https://github.com/SpongeBob-GitHub

================

> 二叉树

  • 二叉树
  • 树(tree)是一种称为节点(node)的元素的有限集合
  • 树具有一个唯一节点(根节点),每个节点最多具有2个子节点(左孩子、右孩子)。
  • 叶节点、它的左右孩子节点为NULL
  • 遍历(Traversal)
  • 是指沿着某条搜索路线依次对树中每个结点均做一次且仅做一次访问
  • 树的遍历:1、沿链表移动;2、根据下标访问,指向链表的数组元素。
  • [ 通过根节点访问时间决定 ]
  • 中序(inorder):先访问左子树,再访问根节点
  •      左->根->右(必须递归遍历完后,再进行下一步)
  • 前序(preorder):先访问根节点
  •      根->左->右
  • 后序(postorder):访问完左右子树后,才访问根节点
  •      左->右->根
  • Binary Tree
  • /* Inorder binary tree traversal. */
  • void inorder (BTREE root)
  • {
  • if (root != NULL) {
  • inorder(root -> left);      /* recur left */
  • printf("%c", root -> d);
  • inorder(root -> right);     /* recur right */
  • }
  • }
  • /* Output: A B C D E F G H I J */
  • 前序和后序函数:
  • /* Preorder and postorder binary tree traversal. */
  • // preorder
  • void preorder (BTREE root)
  • {
  • if (root != NULL) {
  • printf("%c", root -> d);
  • preorder(root -> left);         /* recur left */
  • preorder(root -> right);        /* recur right */
  • }
  • }
  • /* Output: G D B A C F E I H J */
  • // preorder
  • void postorder (BTREE root)
  • {
  • if (root != NULL) {
  • postorder(root -> left);            /* recur left */
  • postorder(root -> right);       /* recur right */
  • printf("%c", root -> d);
  • }
  • }
  • /* Output: A C B E F D H J I G */
  • 创建BTREE
  • /* Creating a binary tree. */
  • BTREE new_node(void)
  • {
  • return (malloc(sizeof(NODE)));
  • }
  • BTREE init_node (DATA d1, BTREE p1, BTREE p2)
  • {
  • BTREE t;
  • t = new_node();
  • t -> d = d1;
  • t -> left = p1;
  • t -> right = p2;
  • return t;
  • }

PS:一般栈区中的内存,系统会自己管理;作为Coder,我们只需管理堆区的内存分配&释放!

================

# 总结 #

  • 1 抽象数据类型(ADT)堆栈可以使用链表来实现,对它的限制在它的第一个元素(称为顶部)。堆栈具有后进先出(LIFO)的特性,这个行为是由push()和pop()函数实现。
  • 2 ADT队列也可以用链表来实现,对它的访问限制在它的头部和尾部。队列具有先进先出(FIFO)的特性,这个行为是由enqueue()和dequeue()函数实现的。
  • 3 当算法使用迭代方式实现时,需要使用一个迭代循环,在监测到NULL时终止。迭代算法的代价是需要使用辅助指针,但它的效率一般高于递归算法。
  • 4 链表处理的标准算法用递归来实现非常自然。基本条件常常就是检测到NULL链。一般条件通过在链表结构中移动链来进行递归。
  • 5 二叉树由包含两个链成员的结构来表示,它组合了线性链表的动态特征,并且可以非常快地访问树中的每个元素。二叉树的元素之间的距离通常是对数级的。
  • 6 二叉树最常用使用三种遍历方法。每种访问方法是通过根节点的访问时间决定的。这三种遍历方式都可以用递归来实现,从左向右链接每棵子树。
  • 7 PS:自引用结构使用指针来访问相同类型结构的地址!!最简单的自引用结构是线性链表。每个元素指向它的下一个元素,最后一个元素指向NULL。
  • 8 malloc()函数用于动态内存分配。free()函数用于释放参数所指向的内存,把它返回给系统,供以后使用。
  • 9 我们可以指定同时涉及链表和数组的具有可怕复杂性的数据结构。其中一个例子就是实现普通树。在普通树中,每个节点可以具有任意数量的孩子。节点的孩子由链表来表示,它由一个头元素数组所指向。

================

PS:

[ 每日一句 ]

“Nowadays, I don‘t really know where I‘m going, but I hope I go far. ”

[ 每天一首英文歌 ]

" This Love " - Taylor Swift

================

|-> GitHub: SpongeBob-GitHub

|--> Copyright (c) 2015 Bing Ma.

时间: 2024-10-13 10:35:13

数据结构 # 二叉树/堆/栈的相关文章

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

7、蛤蟆的数据结构笔记之七栈的应用之数制转换

7.蛤蟆的数据结构笔记之七栈的应用之数制转换 本篇名言:"人生意义的大小,不在乎外界的变迁,而在乎内心的经验." 上面两篇中我们实现了链栈和链队列,接下去哦我们看看实际中栈的应用场景.本次来看下栈在数制转换的作用. 欢迎转载,转载请标明出处: 1.  原理介绍 十进制N和其他进制数的转换时计算机实现计算的基本问题.简单算法如下: N=(N div d )x d + N modd 2.  实现 2.1         定义结构体 定义堆栈的结构体 typedef struct { int

数据结构学习——堆

1 基本介绍 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树.堆的访问可以通过三个函数来进行即, parent(i) return floor(i/2); left(i) return 2i; right(i) return 2i + 1; left操作可以通过一步左移操作完成,right操作可以通过左移并在地位+1实现,parent操作则可以通过把i右移一位得到.在实现中通常会使用宏或者内联函数来实现这三个操作. 二叉堆有两种,最大堆和最小堆.对于最大堆有 A[i] >= A[left(

数据结构之堆的插入、取值、排序(细致讲解+图片演示)

数据结构之堆(Heap):插入.取值.排序. 堆是一种数据结构,分为最小堆和最大堆,可以用二叉树来表示. 在二叉树的任意的一个三角结构中(一个父节点,两个子节点),需要满足以下两个条件: 1.父节点要是最小的,就是最小堆(或最大的,就是最大堆),两个子节点之间没有要求 2.数据插入的顺序是一层一层的,只有上一层存满,才会有下一层 下面我们以图片的形式演示最小堆的插入.取值.和排序操作,只要知道最小堆的原理,那么最大堆也就明白了. 假设我们有一个原始的最小堆如下: 插入操作: 当插入一个新值时,首

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. 可以和(编程训练)再回首,数据结构--二叉树的前序.中序.后序遍历(递归)对比着看 [问题描述] 根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序.中序.后序遍历. [基本要求] ·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序.中序.后序遍历. ·输入:输入二叉树的顺序存储. ·输出:二叉树的先序.中序.后序遍历序

浅谈数据结构-二叉树

浅谈数据结构-二叉树 二叉树是树的特殊一种,具有如下特点:1.每个结点最多有两颗子树,结点的度最大为2.2.左子树和右子树是有顺序的,次序不能颠倒.3.即使某结点只有一个子树,也要区分左右子树. 一.特殊的二叉树及特点 1.斜树 所有的结点都只有左子树(左斜树),或者只有右子树(右斜树).这就是斜树,应用较少 2.满二叉树 所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树.就是完美圆满的意思,关键在于树的平衡. 根据满二叉树的定义,得到其特点为: 叶子只能出现

数据结构快速回顾——栈

堆栈,也可直接称栈,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端进行加入资料和输出资料的运算.另外堆栈也可以用一维阵列或连结串行的形式来完成. 1 #define STACK_INIT_SIZE 100 2 #define STACKINCREMENT 10 3 4 typedef struct 5 { int* top; 6 int* base; 7 int stacksize; 8 }SqStack; 9 10 int InitStack(SqStack &

javascript数据结构与算法---栈

在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 一:对栈的操作. 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端陈为栈顶.比如餐馆里面洗盘子,只能先洗最上面的盘子,盘子洗完后,也只能螺到这一摞盘子的最上面.栈被称为 "后入先出"(LIFO)的数据结构. 由于栈具有后入先出的特点

数据结构实验之栈:进制转换

            数据结构实验之栈:进制转换 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数:第二行输入R. 输出 输出转换所得的R进制数. 模板: while(n!=0) { mod = n%r; q[i++] = mod;//i初始化为0 n/=r; }