数据结构
文章平均质量分 52
zxnsirius
走上坡路!
展开
-
几种链表概念
何谓链表? :链式存储的线性表,简称链表。链表由多个链表元素组成,这些元素称为节点。结点之间通过逻辑连接,形成链式存储结构。存储结点的内存单元,可以是连续的也可以是不连续的。逻辑连接与物理存储次序没有关系。链表分为两个域: 值域:用于存放结点的值 链域:用于存放下一个结点的地址或位置从内存角度出发: 链表可分为 静态链表、动态链表。 从原创 2016-03-26 19:50:53 · 997 阅读 · 0 评论 -
二叉树入门
树的基本概念树是模拟实现树干和树枝的一种数据结构,如同树根一样,树结构都有一个“根结点”。根节点之下如同树的树枝一样,可以拥有0到n个“子结点”,也就是树的”分支“。 如上图。A就是这棵树的根节点,B、C就是结点A的子结点。也就是树枝。每一根树枝当然可以有小树枝,也就是子节点本身可以拥有子结点。途中D和E是B的子结点。反过来说B是D、E的父结点,结点拥有共同的父结点称为“兄弟结点”。所以D和E原创 2016-07-20 14:48:40 · 539 阅读 · 0 评论 -
二叉树的基本操作精集(创建、遍历、求深度结点以及叶子结点个数)
对于二叉树的操作一般的我们使用递归的方法,因为在二叉树中每一个子树又是一颗二叉树。 这篇代码主要是演示了二叉树的以下操作二叉树的创建二叉树的三种遍历求解二叉树的高度求解指定层数的结点个数求解二叉树的叶子结点个数/*********************************************************- Copyright (C): 2016- File原创 2016-07-31 23:52:45 · 4067 阅读 · 1 评论 -
二叉树(BST树)的查找
如图:一棵二叉树我们把这样的二叉树称为二叉查找树或二叉排序树(也叫BST树Binary Search Trees) 其特性如下:每一个结点的值都不同,也就是整棵树中的每一个结点都拥有不同的值每一个结点的数据大于左子树结点(如果有的话)的数据,但是小于右子树的结点(如果有的话)的数据。左右两部分的子树,也是一课二叉查找树。如果二叉树的结点数据已经按照上述规则进行排序,二叉树的查找就十分简单。原创 2016-08-05 14:20:23 · 664 阅读 · 0 评论 -
二叉树(BST树)内结点的删除(3种情况全解)
现在有一棵二叉树查找树如下: 如果我们需要删除一个结点,而且在删除之后,依然满足二叉查找树的数据排序策略。此时删除操作可分为一下三种情况。如下情况1:结点没有左子树 如图:一棵没有左子树的二叉树 如果在此情况下删除结点,按照结点的位置又可以分为三种处理方式。如下删除根结点:删除根结点也就是删除结点 5,此时只需将根结点指针指向其右子树结点。如下图 删除叶子结点:如果删除的结点是叶子结原创 2016-08-05 17:59:24 · 34959 阅读 · 8 评论 -
二叉树的复制
复制二叉树在二叉树的使用上常常需要备份原来的二叉树。如何复制直接看代码/*********************************************************- Copyright (C): 2016- File name : copytree.c- Author : - Zhaoxinan -- Date : 2016年原创 2016-08-05 19:30:43 · 9092 阅读 · 0 评论 -
将树转化为二叉树表示
二叉树在数据结构的重要性是因为所有的树都可以通过简单的转换,而称为一棵二叉树。一般的树,每个结点都会有n个分支,这样处理起不同的分支的树都需要重新设计一套操作方案,而且空指针的问题会比二叉树更加的严重。来看一个例子,如下一颗树 如果需要将上图的树转换为二叉树,也就是由N个分支转换为2个分支。我们可以把每一个拥有同一父节点的子节点,也就是兄弟结点向右连接起来。保留最左边的父子连接,将其他的父子连接都原创 2016-08-05 20:14:45 · 4395 阅读 · 3 评论 -
二叉树(BST树)的插入
要进行插入,首先要在BST中进行查找,若key值已经存在,则应返回ERROR;不存在时,由于第一步的search操作已经返回了查找路径上的最后一个结点,只需要把key值与最后一个节点的值进行比较,比它小则为左子树,反之为右子树,代码如下:/* 二叉树(BST树)的插入 */#include <stdio.h>#include <stdlib.h>struct tree原创 2016-08-02 02:35:41 · 2047 阅读 · 0 评论 -
判断二叉查找树是否是平衡二叉树(代码)
递归解法: (1)如果二叉树为空,返回真 (2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,其他返回假参考代码:/*********************************************************- Copyright (C): 2016- File name : isavl.cpp- Autho原创 2016-08-08 13:40:01 · 1202 阅读 · 0 评论 -
二叉树已知先序中序求后序、已知中序后序求先序
在做数据结构面试题的时候我们会经常发现有关二叉树的题目总是这样的 栗子: 已知某二叉树先序为……中序为……求后序 已知某二叉树中序为……后序为……求先序 需要注意的是(我们只能够通过已知先序中序求后序或已知中序后序求先序,而不能够已知先序和后序求中序) 下面总结一下两种题的做法首先回顾知识点二叉树先序遍历 根结点—->左子树—->右子树二叉树中序遍历 左子树—->根结点原创 2016-07-30 23:18:22 · 10788 阅读 · 0 评论 -
循环队列的综合操作(出入队、获取队长度)C语言实现
线性表有顺序存储和链式存储,栈是线性表,所以也有两种存储方式。同样,队列作为一种特殊的线性表,也同样存在两种存储方式。 那就是顺序队列、链式队列两种 这里主要介绍顺序队列,链式队列我在上一篇博客中详细介绍了(因为用的比较多)。想看链式队列的话大家可以参考 http://blog.csdn.net/zxnsirius/article/details/51211953 与原创 2016-04-21 21:04:39 · 14144 阅读 · 1 评论 -
线性表的 顺序存储 与 链式存储 的区别与特点
那么线性表的顺序存储结构和线性表的链式存储结构的区别是什么呢?线性表的顺序存储结构的特点数组就是一个很典型的例子:它的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任意一个元素,它的存储位置可用一个简单、直观的公式来表示。然而,从另一方面,这个特点也铸成了这种存储结构的弱点:在插入和删除操作时,需要移动大量的元素。比如:我们要在数组中插入或者删除一个元素,这个位置后面的元素原创 2016-04-18 16:34:58 · 7958 阅读 · 0 评论 -
单链表的头插、中插、尾插、删除、逆序、显示(C语言实现)
单链表的定义:单链表是一种顺序存储的结构。 有一个头结点,没有值域,只有连域,专门存放第一个结点的地址。 有一个尾结点,有值域,也有链域,链域值始终为NULL。 所以,在单链表中为找第i个结点或数据元素,必须先找到第i - 1 结点或数据元素,而且必须知道头结点,否者整个链表无法访问。单链表的综合操作:#include <stdio.h>#include <stdlib.h>/* 创建原创 2016-04-18 21:39:19 · 1774 阅读 · 1 评论 -
表达式计算器(逆波兰法)栈操作(C语言实现)
可能很多的同学在学数据结构的时候。说到栈,都会有一道很经典的题目,那就是用栈来实现计算器。我们都知道普通的计算写起来是很简单的,但是如果涉及到左右括号以及加减乘除组成的运算式的时候则写起程序时便不那么容易了。 比如:(1+(2*(1+3)/2)+10) 面对上面这个表达式,要想写出这样一个计算器的程序就显得比较困难,有一种先进后出的数据结构———栈就可以很好的解决这个问题。那么是不是我们有了栈之原创 2016-04-07 19:03:41 · 10846 阅读 · 8 评论 -
循环链表的创建、插入、删除、逆序、显示(C++实现)
对于单链表,由于每个结点只存储了向后的指针。到了尾标志就停止了向后链的操作,这样,当中某一结点就无法找到它的前驱结点了。 对于单链表的操作大家可以看我的这篇博客http://blog.csdn.net/zxnsirius/article/details/51183055我们将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成了一个环,这种头尾相接的单链表称为单循环链表,简称循环链表原创 2016-04-19 16:21:09 · 2009 阅读 · 2 评论 -
双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)
我们在单链表中,有了next指针,这就使得我们要查找下一个结点的时间复杂度为O(1),可是如果我们要查找的是上一个结点的话,那么最坏的时间复杂度为O(n)。因为我们每次都要从头开始遍历。为了克服单向性这一缺点,双向链表就横空出示。双向链表是在单链表的每一个结点中再设置一个指向前驱结点的指针域。所以在双向链表中的所有结点都有两个指针域,一个指向直接后继,另一个指向其直接前驱。下面分享一下我写的双向链表原创 2016-04-19 20:39:43 · 1994 阅读 · 0 评论 -
顺序栈的(创建、出入栈、取栈顶、判断栈空)C语言实现
栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。不含元素的空表称为空栈。 假设栈S=(a1, a2, ….,a3),则称a1为栈底元素,an为栈顶元素,栈中元素按a1,a2,…,an的次序进栈,退栈的第一个元素应该为栈顶元素。换句话说,栈的修改是按照先进后出的原则进行的,因此,栈又称为原创 2016-04-21 10:42:27 · 15777 阅读 · 3 评论 -
链式栈的综合操作(创建、出入栈、取栈顶、判栈空)C++实现
对于栈的概念、图示以及顺序栈的实现我在上一篇博客进行了讲解和代码共享。如果大家需要看顺序栈的综合操作可以看我的上一篇博客。 http://blog.csdn.net/zxnsirius/article/details/51206766这里主要给大家讲一下链式栈的操作: 首先说一下链式栈与顺序栈的区别 顺序栈与链式栈的相同点。都是只能存栈顶获取或者插入元素。且二者的时间复杂度都是相同的O(原创 2016-04-21 13:05:37 · 3781 阅读 · 0 评论 -
链队列的综合操作(详解、演示)C语言实现
队列的简介 和栈相反,队列(queue)是一种先进先出(简称FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。 举个我们生活中最最常见的例子:银行排队(不管什么排队),当我们去银行办理业务的时候,我们要按照先来后到的规矩,先来的人先处理后面的人候着,先来的人处理完了之后先走….. 根据上面的例子大家应该可以很清楚的理解队列是什么了,再来看个示意图 和线性表类似原创 2016-04-21 18:56:20 · 4885 阅读 · 0 评论 -
平衡二叉树(AVL树)深入解读
平衡二叉树又称AVL树性质:它或者是颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有节点的平衡因子只可能为-1,0,1. 只要二叉树上有一个节点的平衡因子的绝对值大于1,那么这颗平衡二叉树就失去了平衡。 根据上述性质我们可以发现图(原创 2016-08-06 18:10:33 · 10338 阅读 · 4 评论