数据结构
文章平均质量分 76
Sharp_UP
自信加努力造就成功!
展开
-
平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡
AVL树的插入在向一棵本来高度平衡的AVL树中插入一个新节点时,如果树中某个结点的平衡因子的绝对值 > 1,则出现了不平衡。设新插入结点为P,从结点P到根节点的路径上,每个结点为根的子树的高度都可能增加1,因此在每执行一次二叉搜索树的插入运算后,都需从新插入的结点P开始,沿该结点插入的路径向根节点方向回溯,修改各结点的平衡因子,调整整棵树的高度,恢复被破坏的平衡性质。 AVL树插入算法原创 2017-04-21 22:32:16 · 835 阅读 · 0 评论 -
找出无序数组最小的K个数(基于快排,效率高)
#include <iostream>using namespace std;void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void GetLeastNumbers_Solution(int input[],int start, int end, int k) { int原创 2017-10-04 00:30:06 · 975 阅读 · 0 评论 -
面试题:找两个有序数组所有数第K小的数
给定两个有序数组arr1和arr2,再给定一个整数k,返回两个数组中所有数中第k小的数。要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M, N}) )例如:arr1 = {1,2,3,4,5}arr2 = {3,4,5}k = 1;因为1为所有数中最小的,所以返回1arr1 = {1,2,3}arr2 = {3,4,5,6}k = 4因为3为所原创 2017-08-23 18:26:08 · 2103 阅读 · 0 评论 -
微信红包问题:找出某个出现次数超过红包总数一半的红包的金额(面试题)
1、问题描述春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。测试样例:[1,2,3,2,2],5返回:22、问题思路可以使用ma原创 2017-08-13 13:24:26 · 2135 阅读 · 0 评论 -
八大排序算法:插入(2:插入、希尔)、选择(2:选择、堆)、交换(2:冒泡、快速)、归并、基数
八大排序算法发表于2012/7/23 16:45:18 662397人阅读分类: c/c++ 数据结构与算法概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间原创 2017-08-09 22:29:23 · 905 阅读 · 0 评论 -
数据结构:排序算法之交换排序(冒泡排序、快速排序)
1、冒泡void bubbleSort(int a[], int n){ for(int i =0 ; i< n-1; ++i) { for(int j = 0; j < n-i-1; ++j) { if(a[j] > a[j+1]) { int tmp = a[j] ; a[j] = a[j+1] ; a[j+1] = tmp; } } }}/*原创 2017-08-09 22:18:11 · 499 阅读 · 0 评论 -
面试题:找出公司员工最喜欢的k种水果
1、问题本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。void GetFavoriteFruit(const原创 2017-08-09 21:53:20 · 1032 阅读 · 0 评论 -
数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
1、栈和队列分析栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头 (Front)。2、两个队列实现一个栈:利用队列先原创 2017-07-19 23:44:31 · 609 阅读 · 0 评论 -
数据结构:排序算法之堆排序和选择排序
1、堆排序void HeapAdjust(int array[], int root, int size){ int parent = root; int child = root*2 + 1; while(child < size) { //还剩三个数据时:1(0), 2(1), 3(2)左右孩子需要调整,此时:child+1 == child if(child+1 <= si原创 2017-08-08 00:52:55 · 389 阅读 · 0 评论 -
数据结构:排序算法之插入排序
1、直接插入排序void InsertSort(int array[], int size){ for(int idx=1; idx<size; idx++) { int temp = array[idx]; int end = idx-1; while(end>=0 && array[end] > temp)原创 2017-08-08 00:40:08 · 347 阅读 · 0 评论 -
数据结构:将二叉搜索树转换成一个排序的双向链表
1、将二叉搜索树转换成一个排序的双向链表。提示:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。--中序线索化的变型。 Node* BSTreeToList() { if(_pRoot == NULL) return NULL; Node* pHead = _pRoot; //找到最左边的结点,即转原创 2017-08-08 00:32:11 · 420 阅读 · 0 评论 -
二叉树面试题:判断树是否为完全二叉树和求二叉树的镜像
1、判断二叉树是否为完全二叉树:层序遍历,从上到下,从左到右,遍历二叉树;当遇到一个节点的左子树为空时,则该节点的右子树为空和后面遍历的节点都为叶子节点,否则不是完全二叉树。当该节点只有左子树时,且该子树为叶子结点,否则不为完全二叉树。判断实现:bool _IsCompleteBinaryTree(BinaryTreeNode* pRoot) { if(pRoot ==原创 2017-07-31 23:48:19 · 789 阅读 · 0 评论 -
]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
1、判断两个链表是否相交,若相交,求交点。(假设链表不带环)两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点。int IsCross(Node* pHead1, Node* pHead2){ Node* Node1 = pHead1; Node* Node2 = pHead2; if((NULL == pHead1) ||原创 2017-07-19 13:32:49 · 627 阅读 · 0 评论 -
数据结构:单链表操作之如何判断链表是否带环及相关操作
//判断链表是否有环int HasCircle(Node* pHead){Node* low=pHead;Node* fast=pHead; while(fast != NULL && fast->next != NULL) { low=low->next; fast=fast->next->next;原创 2017-07-16 01:57:25 · 419 阅读 · 0 评论 -
数据结构:神奇的B树实现解析(有图有代码有真相!!!)
一、B树引入二叉搜索树、平衡二叉树、红黑树都是动态查找树,典型的二叉搜索树结构,查找的时间复杂度和树的高度相关O(log2N)。1)数据杂乱无章-------线性查找--O(n)2)数据有序-------二分查找 ---O(log 2 n) 最差退化成单支树-----线性结构3)二叉搜索树、AVL树、红黑树 --------O(log2 n)数据一般保存在磁盘上,原创 2017-06-05 23:54:32 · 2909 阅读 · 2 评论 -
求1到n ,这n个整数的二进制表示比特1的个数(时间复杂度:O(n))
题目描述:给定一个数字n,统计1~n之间的n个数字的二进制的1的个数int Nums_Of_Bit_1(int num) { int* number = new int[num]; int pow = 1,before =1;int count = 0; for(int i=1; i if (i == pow){原创 2017-10-28 00:43:48 · 1397 阅读 · 0 评论