
数据结构
雪峰流云
以技术为乐的程序猿!
展开
-
有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!
对该问题,分为如下几种情形讨论:(1)假如该树为二叉树,并且是二叉搜索树, 依据二叉搜索树是排过序的, 我们只需要从树的根结点开始,逐级往下,和两个输入的结点进行比较.如果当前结点的值比两个结点的值都大,那么最低的公共祖先一定在当前结点的左子树中,下一步遍历当前结点的左子节点.如果当前结点的值比两个结点的值都小,那么最低的公共祖先一定在当前结点的右子树中,下一步遍历当前结点的右子结点.原创 2013-11-25 09:42:57 · 1165 阅读 · 0 评论 -
求无序数组的中位数(c语言版本)
在面试时,会经常被问道,如何求解一个无序数组的中位数?很多人往往都会第一感觉就是,先将该数组排序,然后找出最中间的那个数,但是这种思路通常的时间复杂度最好是O(nlogn),更糟的情况下会到O(n^2),并不是最优解,也就不能impressed面试官了。下面我们聊聊这个话题。何为中位数?中位数,就是数组排序后位于数组最中间位置的那个元素。当然,细分析的话,还要区分该数组的长度,如果该数组长...原创 2019-03-22 16:06:41 · 9523 阅读 · 1 评论 -
无序单链表排序算法(c语言版本)
这是一道非常经典的面试题。我们知道,快速排序的思想是,通过一个基准元素(pivot),一趟排序就将数据划分为两个部分:左边的部分小于该基准元素,右边的部分大于该基准元素。另外,实现快速排序的关键在于随机访问数据元素,所以快速排序通常都是基于数组来实现的,但是面试中往往会要求对无序单链表进行快排,这就明显不能使用快速排序的基本思想,因为从链表尾部无法向链表头部遍历。解决方法还是基于快速排序思想,...原创 2019-03-21 16:57:12 · 6867 阅读 · 0 评论 -
删除单链表中的重复节点(c语言版本)
这是一道经典的面试题,下面是我的研究和举一反三,特整理如下:分为三种情形:(1)删除有序链表的重复节点,重复节点一个都不留(2)删除有序链表的重复节点,重复节点只留一个(3)删除无序链表的重复节点,重复节点只留一个下面是相关节点的定义:typedef struct ListNode { int val; struct ListNode *next; ...原创 2019-03-20 14:02:42 · 14579 阅读 · 0 评论 -
BST(binary search tree)类型题目需要用到的头文件binary_tree.h
下面是二叉搜索树需要用到的头文件binary_tree.h#include struct BinaryTreeNode{ int value; BinaryTreeNode* pLeft; BinaryTreeNode* pRight;};BinaryTreeNode* CreateBinaryTreeNode(int value){ Bin原创 2013-11-26 10:56:43 · 2143 阅读 · 0 评论 -
将BST转换为有序的双向链表!
在二叉树中,每个结点都有两个指向子结点的指针. 在双向链表中, 每个结点也有两个指针,它们分别指向前一个结点和后一个结点.由于这两种结构的相似性, 同时二叉搜索树也是一种排过序的数据结构, 因此在理论上有可能实现二叉搜索树和排序的双向链表之间的转换.下面的文件BST_to_DL.cpp将BST转换为排序过的双向链表,请参加代码:#include "binary_tree.h原创 2013-11-26 11:03:13 · 1406 阅读 · 0 评论 -
tree类型题目需要用到的头文件tree.h
下面是树类型题目需要用到的头文件tree.h,请包含在cpp文件中编译,而不是放在c文件中编译,比如查找树中两个节点的最低公共父结点的题common_parent_in_tree.cpp,编译它的方法是:g++ -g common_parent_in_tree.cpp -o common_parent_in_tree下面是tree.h的内容:#include #inclu原创 2013-11-25 09:14:05 · 6919 阅读 · 0 评论 -
链表类型题目需要用到的头文件list.h
下面是后面链表相关题目中需要用到的链表结点的定义和相关操作函数,参见下面的list.h文件:注意链表结点的定义采用cpp的定义方式,它会被cpp的文件调用。比如后面删除链表重复结点的文件del_repeated_list.cpp中的编译方式:g++ -g del_repeated_list.cpp -o del_repeated_list#include #include原创 2013-11-24 21:29:14 · 11235 阅读 · 0 评论 -
删除链表中的重复项
方法一:时间优先建立一个hash_set,key为链表中已经遍历的节点内容,开始时为空。从头开始遍历链表中的节点:- 如果节点内容已经在hash_set中存在,则删除此节点,继续向后遍历;- 如果节点内容不在hash_set中,则保留此节点,将节点内容添加到hash_set中,继续向后遍历。这里STL没有hash_set,我直接用set实现的:方法二:空间优先解原创 2013-11-24 12:28:57 · 1354 阅读 · 0 评论 -
数据结构与算法常用名词术语整理
binary search 二分查找half-interval search 折半查找logarithmic search 对数搜索sentinel 哨兵pivot 基准数median 中位数,中值partition 分割percolate 过滤sentinel 哨兵linear time 线性时间logarithmic time 对数时间call st...原创 2019-04-25 14:03:35 · 1081 阅读 · 0 评论