
数据结构
文章平均质量分 50
csxcoder
To be or not to be !
展开
-
判断一棵二叉树是不是平衡二叉树
二叉树中任意左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。两种解法。第一种:菜鸟的解法,出现重复遍历,时间复杂度高。 1 bool IsBalanced(BinaryTreeNode* root) 2 { 3 if (root == NULL) 4 { 5 return true ; 6 } 7 int原创 2015-03-23 10:04:57 · 363 阅读 · 0 评论 -
数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入数组:{1,3,3,2,3,2,3,3,2}。由于2在数组中出现了5次,超过数组长度的一半,因此要输出2。有两种解法:第一种方法是基于快速排序算法的原理,边排序边判断是否符合输出条件。这种方法的代码我因为没有保存,在电脑蓝屏之后全部消失了·······~~~~(>_第二种方法是根据数组特点找出的算法,时间复杂度为原创 2015-03-23 10:04:00 · 314 阅读 · 0 评论 -
将一棵二叉树转换为双向链表的俩中算法
要求:输入一棵二叉排序树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点的指针的指向。如下图:方法一:我们借助一个容器来顺序存储结点的指针,然后改变指针的指向。 1 //////////////////////二叉搜索树与双向链表(方法一)////////////////////////////////////////// 2 3 void原创 2015-03-23 10:03:51 · 566 阅读 · 0 评论 -
打印二叉树中和为某一值的路径
输入一个二叉树,查找该树的所有路径(从根结点到叶结点的通路),并返回和(路径上所有结点值的和)为某一指定值的路径。 1 /////////////二叉树中和为某一值的路径///////////////////// 2 void FindPath(BinaryTreeNode* pRoot ,int expectedSum ,vectorint>& path ,int currentSu原创 2015-03-23 10:03:34 · 299 阅读 · 0 评论 -
从上往下打印二叉树
要求:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。算法思想:每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直到队列中所有的结点都被打印出来为止。1 struct BinaryTreeNode //节点2 {3 int m_nValue;4原创 2015-03-23 10:03:27 · 301 阅读 · 0 评论 -
二叉树的镜像
完成一个函数,输入一个二叉树,该函数输出它的镜像 1 void Mirror(BinaryTreeNode* pHead) 2 { 3 if ( pHead == NULL || ( pHead->m_pLeft == NULL && pHead->m_pRight == NULL )) 4 { 5 return; 6 }原创 2015-03-23 10:03:08 · 382 阅读 · 0 评论 -
树的子结构
输入2棵二叉树A和B,判断B是不是A的子结构。1 struct BinaryTreeNode //节点2 {3 int m_nValue;4 BinaryTreeNode* m_pLeft;5 BinaryTreeNode* m_pRight;6 }; 1 bool DoseTree1HaveTree2(BinaryTreeNode*原创 2015-03-23 10:02:57 · 220 阅读 · 0 评论 -
合并两个排序的链表(非递归)
输入两个递增排序的链表,合并这两个链表并使新链表中的结构任然递增!1 struct ListNode 2 {3 int m_nValue;4 ListNode* m_pNext;5 }; 1 ListNode* CreatList(int* data , unsigned int length) 2 { 3 if (!data |原创 2015-03-23 10:02:45 · 423 阅读 · 0 评论 -
调整数组循序使奇数位于偶数前面
1 void ReorderOddEven(int *pData , unsigned int length) 2 { 3 if (!pData || length 0) 4 { 5 return; 6 } 7 int* pBegin = pData ; 8 int* pEnd = pData + length -原创 2015-03-23 10:02:32 · 381 阅读 · 0 评论 -
qsort 函数用法
用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向比较函数的指针 : 注意这里的比较函数必须是返回int型,且2个形参都是 const void * 类型原创 2015-03-23 10:04:18 · 219 阅读 · 0 评论 -
'\0'
'\0'是C++中字符串的结尾标志,存储在字符串的结尾。比如char cha[5]表示可以放4个字符的数组,由于c/c++中规定字符串的结尾标志为'\0',它虽然不计入串长,但要占内存空间,而一个汉字一般用两个字节表示,且c/c++中如一个数组cha[5],有5个变量,分别是 cha[0] , cha[1] , cha[2] , cha[3] , cha[4] , 所以cha[5]可以放4个字原创 2015-03-23 10:04:33 · 352 阅读 · 0 评论 -
寻找链表中倒数第K个结点的位置
输入一个链表,输出该链表中倒数第K个结点。 1 struct ListNode 2 { 3 int m_nValue; 4 ListNode* m_pNext; 5 }; 6 ListNode* FindKthToTail(ListNode* pListHead , unsigned int K) 7 { 8 if (!pListH原创 2015-03-23 10:02:34 · 494 阅读 · 0 评论 -
二叉树的深度
多的不解释了,这里有两种解法。第一种:一般的解法 1 void Deep(BinaryTreeNode* root , int& Maxdeep , int count) 2 { 3 if (root->m_pLeft || root->m_pRight) 4 { 5 count++; 6 if (root->m_pL原创 2015-03-23 10:04:55 · 278 阅读 · 0 评论 -
把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数子中的最小的一个。例如:输入数组{3,32,121},则打印出 121323 。我们先把数组中的整数转换成字符串,在函数compare中定义比较规则,并根据该规则用库函数qsort排列。最后把排序好的数组中的数字依次打印出来,就是该数组中数字拼接出来的最小数字。这种思路的时间复杂度是O(nlogn)。代码如下:原创 2015-03-23 10:04:21 · 267 阅读 · 0 评论 -
最小的K个数
输入n个数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8 这8个数,则最小的4个数是1,2,3,4.解法一:O(n)的算法,只有当我们可以修改输入数组时可用 1 int Partitoin(int* input, int low, int high) 2 { 3 if (input == NULL || low 0 || high 0 || low >原创 2015-03-23 10:04:05 · 274 阅读 · 0 评论 -
八皇后问题
8个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占一行。于是我们可以定义一个string字符串,字符串中第i个数字表示位于第i行的皇后的列号。先把string字符串分别用0~7初始化,接下来就是对字符串做全排列。因为我们用不同的数字初始化字符串,所以任意两个皇后肯定不同列。我们只需判断每一个排列对应的8个皇后是不是在同一对角线上,也就是对于string的两个下标i和j,是不是原创 2015-03-23 10:03:55 · 239 阅读 · 0 评论 -
复杂链表的复制
实现一个函数复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。1 //结点定义2 struct ComplexListNode 3 {4 int m_nValue;5 ComplexListNode* m_pNext;6原创 2015-03-23 10:03:41 · 378 阅读 · 0 评论 -
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入矩阵{1, 2, 3, 4 } {5, 6, 7, 8 } {9, 10, 11, 12 } {13, 14, 15, 16 }输出:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 代码如下:原创 2015-03-23 10:03:15 · 262 阅读 · 0 评论 -
合并两个排序的链表(递归算法)
输入两个递增排序的链表,合并这两个链表并使新链表中的结构任然递增! 1 ///////////////////合并两个排序的链表(递归算法)///////////////////////////////// 2 ListNode* Merge(ListNode* pHead1 ,ListNode* pHead2) 3 { 4 if (pHead1==NULL) 5原创 2015-03-23 10:02:48 · 427 阅读 · 0 评论 -
反转链表
输入一个链表的头结点,反转该链表,并输出反转后链表的头结点。1 struct ListNode 2 {3 int m_nValue;4 ListNode* m_pNext;5 }; 1 ListNode* ReverseList(ListNode* pHead) 2 { 3 ListNode* pReverseHead = NUL原创 2015-03-23 10:02:43 · 226 阅读 · 0 评论 -
在O(1)时间删除链表结点
//给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 1 struct ListNode //结点结构 2 { 3 int m_nValue; 4 ListNode* m_pNext; 5 }; 6 7 void DeleteNode(ListNode** pListHead , ListNode* pToBeDeleted) 8原创 2015-03-23 10:02:26 · 234 阅读 · 0 评论