2014年9月27日
程序主要是二叉树方面的,第二面被鄙视了。下面对二叉树的面试题做个总结。
#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; }