2014暴风影音

1.已知一个二叉树的先序遍历和中序遍历得到的序列为ABDEGCFH和DBGEAFHC,请
1)根据先序遍历和中序遍历计算出该二叉树的结构图
2)根据1)的结果,计算该二叉树的后序遍历
后序遍历结果:DGEBHFCA
3)完成后序遍历代码(不得使用迭代函数)
void postorder(BinarySearchTree T)
{
	BinarySearchTree preNode, currNode;
	stack<BinarySearchTree> s;

	preNode = NULL;
	s.push(T);
	while(!s.empty())
	{
		currNode = s.top();
		if(preNode == NULL || preNode->m_pLeft == currNode || preNode->m_pRight == currNode)
		{
			if(currNode->m_pLeft)
				s.push(currNode->m_pLeft);
			else if(currNode->m_pRight)
				s.push(currNode->m_pRight);
		}
		else if(currNode->m_pLeft == preNode)
		{
			if(currNode->m_pRight)
				s.push(currNode->m_pRight);
		}
		else
		{
			cout << currNode->m_nValue;
			s.pop();
		}
		preNode = currNode;
	}
}
2. 将内存中一张宽为X,高为Y的RGB32格式的图片向右旋转90度。源地址BYTE *pSrc为指向图片的首地址,目标地址BYTE *pDst为输出的目标缓冲区
备注:RGB32是一种图像格式,它用4个连续BYTE来表示一个像素,图片的存储方式为一行一样连续存储。
A B
C D
如上表为宽度为2且高度为2的图像,共4个像素,在内存中存储为A[4]B[4]C[4]D[4]
void rotate(BYTE *pSrc, BYTE *pDest, int X, int Y){ }
解:此问题先考虑每个像素占一个字节的情况,然后再将问题扩展为占四个字节的情况。
假设现在有8个像素,宽度为4高度为2,即
ABCD
EFGH
旋转之后变为宽度为2,高度为4,即
EA
FB
GC
HD
A[0][0]->A[0][1]
B[0][1]->B[1][1]
C[0][2]->C[2][1]
D[0][3]->D[3][1]
E[1][0]->E[0][0]
F[1][1]->F[0][1]
G[1][2]->G[0][2]
H[1][3]->H[0][3]
第0行的变为了第(x-1)列,其中原矩阵中的列号与旋转矩阵的行号相同,第(x-1)行变换为了第0行,其中原矩阵的列号与旋转矩阵的行号相同
这里用i表示行,j表示列,则旋转后的pDest[j][x-i-1] = pSrc[i][j],然后将其扩展为4字节问题,即赋值时要一次性复制4字节。代码如下
typedef char BYTE;
const int size = 4;//4字节
void rotate(BYTE *pSrc, BYTE *pDest, int x, int y)
{
	for(int i = 0; i < x; i++)
	{
		for(int j = 0; j < y; j++)
		{
			int dpos = (j * x + (x - i - 1) ) * size;
			int spos  = (i * y + j) * size;
			for(int k = 0; k < size; k++)//每次复制4个字节
				pDest[dpos + k] = pSrc[spos + k];
		}
	}
}
3. 给定字符串A和B,输出A和B中第一个最长公共子串,比如A="wepiabc",B="pabcni"则输出“abc”
#define MAXLEN 50
void LCS(char *A, char *B, char *sub, int tmp[][MAXLEN])
{
	int i, j, max, pos, len_a, len_b;

	len_a = strlen(A);
	len_b = strlen(B);
	
	max = 0;
	pos = -1;

	for(i = 0; i < len_a; i++)
	{
		for(j = 0; j < len_b; j++)
		{
			if(A[i] == B[j])
			{
				if(i == 0 || j == 0)
					tmp[i][j] = 0;
				else
					tmp[i][j] = tmp[i-1][j-1] + 1;
				if(max < tmp[i][j])
				{
					max = tmp[i][j];
					pos = i;
				}
			}
		}
	}
	sub[max] = '\0';
	for(i = 0; i < max; i++)
		sub[max-i-1] = A[pos - i];
}
4. TCP建立连接需要几次握手过程?为什么会采用这么多次握手,请简述过程。若最后一次握手失败,会怎样处理?
解:1)TCP建立连接需要3次握手
2)

3)第三次握手失败,服务器端处于SYN_RCVD状态,服务器端发送复位报文请求建立连接(不知道理解对不对)

5. ClassA是一个类,那么语句ClassA a, *b[2], c[3], &d = a;执行时调用到ClassA的构造函数次数为:4(a调用一次,c[3]调用3次)
6. 32位系统中

struct
{
	char buf[2];//对齐以后占4字节
	int i;//4字节
	char c;//4字节
}sT;
请问sizeof(sT)=?多少 12
7. 甲和乙进行打靶比赛,各打两发子弹,中靶数量最多的人获胜,甲每发子弹中弹的概率是60%,而乙每发子弹中靶的概率是30%,则比赛中乙战胜甲的可能性:
A 小于5%    B 在5%~12%之间   C在10%~15%之间    D大于15%
解:乙获胜情况分为两种,甲中0次,乙至少中靶一次;甲中靶1次,乙中靶两次。
(0.4*0.4)*(1-0.7*0.7) = 0.0816
(2*0.6*0.4)*(0.3*0.3) = 0.0432,故乙获胜的概率为12.48%
8. 请回答下列程序执行后的输出结果
	char *A = "this is a string!", *B = NULL;
	int n = 10;
	memcpy(B,A,n);
	printf(B);

因为B是野指针,会导致运行时错误。

9. 分别指出下列操作系统是哪一种类型?(单用户单任务/单用户多任务/多用户单任务/多用户多任务)
DOS、Windows 7、Windows 2003、Linux、Unix
DOS:单用户单任务
Windows 7:多用户多任务
Linux、Unix:多用户多任务
Windows 2003(Windows Server 2003):多用户多任务
Windows XP及以前Windows版本:单用户多任务
注:参考链接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章