面试题19:二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点的定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
解答:代码如下:
void Mirror(BinaryTreeNode *pRoot)
{
if(NULL == pRoot)
{
return ;
}
BinaryTreeNode *pTmp = pRoot->m_pLeft;
pRoot->m_pLeft = pRoot->m_pRight;
pRoot->m_pRight = pTmp;
if(pRoot->m_pLeft != NULL)
{
Mirror(pRoot->m_pLeft);
}
if(pRoot->m_pRight != NULL)
{
Mirror(pRoot->m_pRight);
}
}
面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:{{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。
解答:代码如下:
vector<int> vec;
void PrintMatrixInCircle(vector<vector<int> > &matrix,int columns,int rows,int start)
{
int endX = columns - 1 - start;
int endY = rows - 1 - start;
for(int i = start;i <= endX;++i)
{
int number = matrix[start][i];
vec.push_back(number);
}
if(start < endY)
{
for(int i = start + 1;i <= endY;i++)
{
int number = matrix[i][endX];
vec.push_back(number);
}
}
if(start < endX && start < endY)
{
for(int i = endX - 1;i >= start;--i)
{
int number = matrix[endY][i];
vec.push_back(number);
}
}
if(start < endX && start < endY - 1)
{
for(int i = endY - 1;i >= start + 1;--i)
{
int number = matrix[i][start];
vec.push_back(number);
}
}
}
vector<int> printMatrix(vector<vector<int> > matrix)
{
if(matrix.size() == 0 || matrix[0].size() == 0)
{
return vec;
}
int rows = matrix.size();
int columns = matrix[0].size();
int start = 0;
while(columns > start * 2 && rows > start * 2)
{
PrintMatrixInCircle(matrix,columns,rows,start);
++start;
}
return vec;
}