程序主要是二叉树方面的,第二面被鄙视了。下面对二叉树的面试题做个总结。
- #include <iostream>
- #include <deque>
- #include <vector>
- using namespace std;
- struct BinaryTreeNode
- {
- int m_nVal;
- BinaryTreeNode *m_pLeft;
- BinaryTreeNode *m_pRight;
- };
- /*
- 根据前序遍历和中序遍历构造二叉树
- */
- BinaryTreeNode* ConstructBinaryTreeCore(int *startPreOrder, int *endPreOrder, int *startInOrder, int *endInOrder)
- {
- BinaryTreeNode *pRoot = new BinaryTreeNode;
- pRoot->m_nVal = startPreOrder[0];
- pRoot->m_pLeft = pRoot->m_pRight = NULL;
- if (startPreOrder == endPreOrder)
- {
- if (startInOrder == endInOrder && *startInOrder == *endInOrder)
- {
- return pRoot;
- }
- else
- {
- return NULL;
- }
- }
- int *current = startInOrder;
- while (*current != startPreOrder[0])
- {
- ++current;
- }
- int len = current - startInOrder;
- if (len > 0)
- {
- pRoot->m_pLeft = ConstructBinaryTreeCore(startPreOrder+1, startPreOrder+len, startInOrder, current-1);
- }
- if ((endInOrder-current) > 0)
- {
- pRoot->m_pRight = ConstructBinaryTreeCore(startPreOrder+len+1, endPreOrder, current+1, endInOrder);
- }
- return pRoot;
- }
- BinaryTreeNode* ConstructBinaryTree(int preOrder[], int inOrder[], int n)
- {
- if (preOrder==NULL || inOrder==NULL || n<=0)
- {
- return NULL;
- }
- return ConstructBinaryTreeCore(preOrder, preOrder+n-1, inOrder, inOrder+n-1);
- }
- /*
- 层次遍历二叉树
- */
- void PrintByLevel(BinaryTreeNode *pRoot)
- {
- if (NULL == pRoot)
- {
- return ;
- }
- deque<BinaryTreeNode *> dq;
- dq.push_back(pRoot);
- while (dq.size() > 0)
- {
- BinaryTreeNode *pNode = dq.front();
- dq.pop_front();
- cout<<pNode->m_nVal<<endl;
- if (pNode->m_pLeft != NULL)
- {
- dq.push_back(pNode->m_pLeft);
- }
- if (pNode->m_pRight != NULL)
- {
- dq.push_back(pNode->m_pRight);
- }
- }
- }
- /*
- 二叉树的映像
- */
- void Mirror(BinaryTreeNode *pRoot)
- {
- if (pRoot == NULL || (pRoot->m_pLeft==NULL && pRoot->m_pRight==NULL))
- {
- return ;
- }
- BinaryTreeNode *pNode = pRoot->m_pLeft;
- pRoot->m_pLeft = pRoot->m_pRight;
- pRoot->m_pRight = pNode;
- if (pRoot->m_pLeft != NULL)
- {
- Mirror(pRoot->m_pLeft);
- }
- if (pRoot->m_pRight != NULL)
- {
- Mirror(pRoot->m_pRight);
- }
- }
- /*
- 打印二叉树中从根节点到叶子节点的节点值之和等于k的所有路径
- */
- void FindPathCore(BinaryTreeNode *pRoot, int sum, vector<int> path, int &curSum)
- {
- curSum += pRoot->m_nVal;
- path.push_back(pRoot->m_nVal);
- bool isLeaf = (pRoot->m_pLeft == NULL && NULL == pRoot->m_pRight);
- if (isLeaf && curSum == sum)
- {
- cout<<"The Path is:"<<endl;
- for (vector<int>::iterator i=path.begin(); i!=path.end(); ++i)
- {
- cout<<*i<<endl;
- }
- cout<<endl;
- }
- if (pRoot->m_pLeft != NULL)
- {
- FindPathCore(pRoot->m_pLeft, sum, path, curSum);
- }
- if (pRoot->m_pRight != NULL)
- {
- FindPathCore(pRoot->m_pRight, sum, path, curSum);
- }
- curSum -= pRoot->m_nVal;
- path.pop_back();
- }
- void FindPath(BinaryTreeNode *pRoot, int sum)
- {
- if (NULL == pRoot)
- {
- return ;
- }
- vector<int> path;
- int curSum = 0;
- FindPathCore(pRoot, sum, path, curSum);
- }
- int main()
- {
- int preOrder[] = {1, 2, 5, 4, 6};
- int inOrder[] = {5, 2, 4, 1, 6};
- BinaryTreeNode *pRoot = ConstructBinaryTree(preOrder, inOrder, 5);
- PrintByLevel(pRoot);
- cout<<endl;
- Mirror(pRoot);
- PrintByLevel(pRoot);
- FindPath(pRoot, 7);
- system("pause");
- return 0;
- }
#include <iostream>
#include <deque>
#include <vector>
using namespace std;
struct BinaryTreeNode
{
int m_nVal;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
/*
根据前序遍历和中序遍历构造二叉树
*/
BinaryTreeNode* ConstructBinaryTreeCore(int *startPreOrder, int *endPreOrder, int *startInOrder, int *endInOrder)
{
BinaryTreeNode *pRoot = new BinaryTreeNode;
pRoot->m_nVal = startPreOrder[0];
pRoot->m_pLeft = pRoot->m_pRight = NULL;
if (startPreOrder == endPreOrder)
{
if (startInOrder == endInOrder && *startInOrder == *endInOrder)
{
return pRoot;
}
else
{
return NULL;
}
}
int *current = startInOrder;
while (*current != startPreOrder[0])
{
++current;
}
int len = current - startInOrder;
if (len > 0)
{
pRoot->m_pLeft = ConstructBinaryTreeCore(startPreOrder+1, startPreOrder+len, startInOrder, current-1);
}
if ((endInOrder-current) > 0)
{
pRoot->m_pRight = ConstructBinaryTreeCore(startPreOrder+len+1, endPreOrder, current+1, endInOrder);
}
return pRoot;
}
BinaryTreeNode* ConstructBinaryTree(int preOrder[], int inOrder[], int n)
{
if (preOrder==NULL || inOrder==NULL || n<=0)
{
return NULL;
}
return ConstructBinaryTreeCore(preOrder, preOrder+n-1, inOrder, inOrder+n-1);
}
/*
层次遍历二叉树
*/
void PrintByLevel(BinaryTreeNode *pRoot)
{
if (NULL == pRoot)
{
return ;
}
deque<BinaryTreeNode *> dq;
dq.push_back(pRoot);
while (dq.size() > 0)
{
BinaryTreeNode *pNode = dq.front();
dq.pop_front();
cout<<pNode->m_nVal<<endl;
if (pNode->m_pLeft != NULL)
{
dq.push_back(pNode->m_pLeft);
}
if (pNode->m_pRight != NULL)
{
dq.push_back(pNode->m_pRight);
}
}
}
/*
二叉树的映像
*/
void Mirror(BinaryTreeNode *pRoot)
{
if (pRoot == NULL || (pRoot->m_pLeft==NULL && pRoot->m_pRight==NULL))
{
return ;
}
BinaryTreeNode *pNode = pRoot->m_pLeft;
pRoot->m_pLeft = pRoot->m_pRight;
pRoot->m_pRight = pNode;
if (pRoot->m_pLeft != NULL)
{
Mirror(pRoot->m_pLeft);
}
if (pRoot->m_pRight != NULL)
{
Mirror(pRoot->m_pRight);
}
}
/*
打印二叉树中从根节点到叶子节点的节点值之和等于k的所有路径
*/
void FindPathCore(BinaryTreeNode *pRoot, int sum, vector<int> path, int &curSum)
{
curSum += pRoot->m_nVal;
path.push_back(pRoot->m_nVal);
bool isLeaf = (pRoot->m_pLeft == NULL && NULL == pRoot->m_pRight);
if (isLeaf && curSum == sum)
{
cout<<"The Path is:"<<endl;
for (vector<int>::iterator i=path.begin(); i!=path.end(); ++i)
{
cout<<*i<<endl;
}
cout<<endl;
}
if (pRoot->m_pLeft != NULL)
{
FindPathCore(pRoot->m_pLeft, sum, path, curSum);
}
if (pRoot->m_pRight != NULL)
{
FindPathCore(pRoot->m_pRight, sum, path, curSum);
}
curSum -= pRoot->m_nVal;
path.pop_back();
}
void FindPath(BinaryTreeNode *pRoot, int sum)
{
if (NULL == pRoot)
{
return ;
}
vector<int> path;
int curSum = 0;
FindPathCore(pRoot, sum, path, curSum);
}
int main()
{
int preOrder[] = {1, 2, 5, 4, 6};
int inOrder[] = {5, 2, 4, 1, 6};
BinaryTreeNode *pRoot = ConstructBinaryTree(preOrder, inOrder, 5);
PrintByLevel(pRoot);
cout<<endl;
Mirror(pRoot);
PrintByLevel(pRoot);
FindPath(pRoot, 7);
system("pause");
return 0;
}
翻转单词顺序
- #include <iostream>
- using namespace std;
- void swap(char *a, char *b)
- {
- char ch = *a;
- *a = *b;
- *b = ch;
- }
- void Reverse(char *pBegin, char *pEnd)
- {
- if (pBegin==NULL || NULL==pEnd)
- {
- return ;
- }
- while (pBegin < pEnd)
- {
- swap(pBegin++, pEnd--);
- }
- }
- char* ReverseSentence(char *pStr)
- {
- if (pStr == NULL)
- {
- return NULL;
- }
- char *pBegin = pStr;
- char *pEnd = pStr;
- while (*pEnd != '\0')
- {
- pEnd++;
- }
- pEnd--;
- Reverse(pBegin, pEnd);
- pBegin = pEnd = pStr;
- while (*pBegin != '\0')
- {
- if (*pBegin == ' ')
- {
- pBegin++;
- pEnd++;
- }
- else if (*pEnd == ' ' || *pEnd == '\0')
- {
- Reverse(pBegin, --pEnd);
- pBegin = ++pEnd;
- }
- else
- {
- pEnd++;
- }
- }
- return pStr;
- }
- int main()
- {
- char pStr[] = "I am a huster.";
- char *str = ReverseSentence(pStr);
- cout<<str<<endl;
- system("pause");
- return 0;
- }