数据结构
雪沫沫
程序代码是个很神奇的东西,我不知道我会在这条路上走多久,但是和他打交道的每一秒我都是开心的,付出努力的。
展开
-
C语言实现静态顺序表
SeqList.h#ifndef _SEQLIST_H_#define _SEQLIST_H_#include "stdio.h"#include "assert.h"#include "stdlib.h"#include "string.h"#define MAXSIZE 10//有效数据元素的个数typedef int DataType;typedef unsigned int siz原创 2017-04-21 16:06:26 · 312 阅读 · 0 评论 -
删除一个无头单链表的非尾节点【每日一题】
1、删除一个无头单链表的非尾节点: 分析:既然是一个无头链表,那么我们就不能通过直接访问这种形式进行删除。找不到上一个,那么就找下一个,让tmp保存node后节点的信息,然后让改动node的值,让node指向tmp的下一个,此时删除tmp,也顺利完成题目的要求。void DelNoHeadNotTail(PNode* pHead , int pos){ if(NULL != pHead原创 2017-07-17 12:23:16 · 607 阅读 · 0 评论 -
链表相交问题【每日一题】
1.判断两个链表是否相交,若相交,求交点。(假设链表不带环) 两个链表均不含有环,链表相交如下图 解法一、直接法 直接判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大。解法二、利用计数 如果两个链表相交,则两个链表就会有共同的结点;而结点地址又是结点唯一标识。因而判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一 个链表原创 2017-07-16 22:49:08 · 266 阅读 · 0 评论 -
链表带环问题【每日一题】
1.如何判断是否有环? 与返回链表倒数第k个节点的问题类似,定义两个结点指针,一个走的快,一个走的慢,那么当快的那个指针追上慢的指针时,说明链表带环。2.如何计算环的长度? 从第一次相遇(超一圈)时开始计数,第二次相遇时停止计数,返回的这个计数即为环的长度。3.如何判断环的入口点:碰撞点到连接点的距离等于头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。上述是一个简原创 2017-07-16 18:23:13 · 296 阅读 · 0 评论 -
实现一颗二叉树的层序遍历【每日一题】
题目:层序遍历二叉树给定一棵二叉树,要求层序遍历该二叉树,即从上到下按层次访问该树,每一层单独输出一行,每一层要求访问的顺序为从左到右。我们在遍历的过程中将该层节点的孩子节点压入一个队列,这样就可以实现从上到下一层一层地遍历该二叉树。 初始时,根结点入队列。 然后,while循环判断队列不空时,弹出一个结点,访问它,并把它的所有孩子结点入队列。template<class T>struct B原创 2017-07-21 13:31:56 · 377 阅读 · 0 评论 -
链表翻转(升级版)【每日一题】
题目:链表翻转。给出一个链表和一个数k,比如链表 1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3, 翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6, 用程序实现Node* RotateList(Node* list, size_t k)。 解决方法:思路和链表翻转一样是将该节点原来指向下一个节点的指针指向该节点的前一个节点,最后得到的新链表的头节原创 2017-07-23 13:03:33 · 253 阅读 · 0 评论 -
求二叉树的高度/销毁一颗二叉树【每日一题】
template<class T>struct BinaryTreeNode{ BinaryTreeNode(const T& data) :_data(data) ,_pLeft(NULL) ,_pRight(NULL) {} T _data; BinaryTreeNode<T>* _pLeft; Binar原创 2017-07-23 13:10:40 · 324 阅读 · 0 评论 -
二叉树三种遍历非递归实现【每日一题】
前序遍历: 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操原创 2017-07-28 16:04:38 · 524 阅读 · 0 评论 -
求一颗二叉树的镜像 【每日一题】
题目: 求一颗二叉树的镜像 解决方法: 创建一个树以后,交换每个节点的左右孩子//递归 void _GetBinaryMirror(Node* pRoot) { if(pRoot) { std::swap(pRoot->_pLeft ,pRoot->_pRight ); _GetBinaryMirr原创 2017-07-28 16:10:00 · 369 阅读 · 0 评论 -
判断一棵树是否是完全二叉树【每日一题】
完全二叉树的定义:对二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求: ●某节点没有左孩子,则一定无右孩子 ●若某节点缺左或右孩子,则其所有后继一定无孩子 不满足上述任何一条,均不为完全二叉树。题目:判断一棵树是否是完全二叉树 解决方法:在层序遍历的过程中,找到第一个非满节。满节点指的是同时拥有左右孩子的节点。在找到第一个非满节点之后,剩下的节点不应该有孩子节点;如果有,那么该二原创 2017-07-28 17:10:55 · 624 阅读 · 0 评论 -
复杂链表的复制【每日一题】
所谓复杂链表是指:节点域中除了有数据域和指向下一个节点的指针,还有一个指向任意节点的指针 链表结构:struct ComplexList{ DataType _data; ComplexList* _pNext; ComplexList* _pRadom;}ComplexList*, pComplexList; 在不使用辅助空间的情况下实现O(n)的时间效率,解决方法原创 2017-07-17 15:00:13 · 174 阅读 · 0 评论 -
栈与队列【每日一题】
1.两个栈实现一个队列: 思路一、s1是入栈的,s2是出栈的 入队列:直接压到s1里 出队列:先把s1中的元素全部压到s2中,弹出s2中的栈顶元素; 再把s2的所有元素压回s1中 思路二、s1是入栈的,s2是出栈的 入队列:如果s1为空,把s2中所有元素压到s1中;否则直接压入s1 出队列原创 2017-07-18 12:20:28 · 202 阅读 · 0 评论 -
数据结构——二叉搜索平衡树
二叉搜索平衡树(AVL树) 1、AVL树引入 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要原创 2017-05-24 17:52:48 · 407 阅读 · 0 评论 -
二叉平衡树代码实现
节点设置template<class K,class V>struct AVLTreeNode{ AVLTreeNode(const K& key,const V& value) :_pLeft(NULL) ,_pRight(NULL) ,_pParent(NULL) ,_key(key) ,_value(v原创 2017-05-24 20:13:26 · 533 阅读 · 0 评论 -
数据结构——二叉树的基本操作
二叉树节点结构template<class T>struct BinaryTreeNode{ BinaryTreeNode(const T& data) :_data(data) ,_pLeft(NULL) ,_pRight(NULL) {} T _data; BinaryTreeNode<T>* _pLeft;原创 2017-05-16 15:10:05 · 278 阅读 · 0 评论 -
数据结构——堆的实现
//普通的模板参数template<class T>struct Less{ bool operator()(const T& left,const T& right) { return left < right; }};template<class T>struct Greater{ bool operator()(const T& le原创 2017-05-16 15:15:14 · 190 阅读 · 0 评论 -
数据结构——哈夫曼树实现
利用小堆实现哈夫曼树Heap.h#pragma once#include <vector>#include <assert.h>//仿函数template<class T>struct Less{ bool operator()(const T& left,const T& right) { return left < right; }};te原创 2017-05-16 15:18:39 · 382 阅读 · 0 评论 -
数据结构——线索化二叉树
#include <iostream>using namespace std;enum PiontFlag{LINK,THREAD};template<class T>struct BinaryTreeNode{ BinaryTreeNode(const T& data) :_data(data) ,_pLeft(NULL) ,_pRig原创 2017-05-16 15:11:53 · 168 阅读 · 0 评论 -
数据结构【排序算法】——冒泡排序
算法描述: 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 算法步骤: 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、原创 2017-07-16 21:37:16 · 373 阅读 · 0 评论 -
数据结构【排序算法】——快速排序
算法描述: 快速排序是由东尼·霍尔所发展的一种排序算法。 在平均状况下,排序 n 个项目要Ο(n log n)次比较。 在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。 事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次原创 2017-07-16 21:38:36 · 279 阅读 · 0 评论 -
【每日一题】实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、 Min(返回最小值的操作)的时间复杂度为O(1)
题目:实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、 Min(返回最小值的操作)的时间复杂度为O(1) 解决方法:使用两个栈_data和_min,_min做为辅助栈(每次压入_min的都是_data的最小值)。元素x入栈时,将x和_min栈顶元素做比较,如果x小于等于_min.top(),将x分别push到_data和_min,否则x只push到_data;元素出栈时,将_dat原创 2017-07-20 12:23:04 · 1698 阅读 · 0 评论 -
求二叉树叶子节点的个数和第k层的节点个数【每日一题】
1.求二叉树中叶子节点的个数 (1)如果二叉树为空,返回0 ; (2)如果二叉树不为空且左右子树为空,返回1; (3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数 。 2.求二叉树中第k层的节点个数 (1)若树为空或k小于1或k大于树的高度,则返回0; (2)若k=1,则表示第一层即为根节点个数,即返回1; (3)如果不是上两种情况,则返原创 2017-07-22 12:01:07 · 671 阅读 · 0 评论