数据结构+算法面试100题~~~摘自CSDN,作者July
1.把二元查树转变成排序的双向链表(树)
题目:
输入一棵二元查树,将该二元查树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
  10
  / /
6  14
/ / / /
4  8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查树节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
  BSTreeNode *m_pLeft; // left child of node
  BSTreeNode *m_pRight; // right child of node
};
2.设计包含min函数的栈(栈)
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
参见C:\Users\Administrator\Desktop\demo\Stack
分析:min时间复杂度要达到O(1),需要我们在栈中存储最小元素
3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。面试综合分析100题
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
分析:根据dp思想
#include <stdio.h>
#define N 8int main()
{int i, a[N] = {1, -2, 3, 10, -4, 7, 2, -5};int from[N], result[N], max;max = 0;from[0] = 0;result[0] = a[0];for (i = 1; i < N; ++i)
{if (result[i - 1] > 0)
{from[i] = from[i - 1];result[i] = a[i] + result[i - 1];
}else
{from[i] = i;result[i] = a[i];
}if (result[i] > result[max])max = i;
}printf("%d->%d: %d\n", from[max], max, result[max]);return 0;
}
4.在二元树中出和为某一值的所有路径(树)
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
  10 
  / / 
5  12
/  / 
4    7
则打印出两条路径:10, 12和10, 5, 7。
二元树节点的数据结构定义为:
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};
5.查最小的k个元素(数组)
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
第6题(数组)
腾讯面试题:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,