1.根据前中序构建一颗二叉树
struct BNode
{
BNode(int val)
:pLeft(NULL)
, pRight(NULL)
,data(val)
{
}
BNode* pLeft;
BNode* pRight;
int data;
};
BNode* _RebulidBinaryTree(BNode* &pRoot,int* pre,int* In,int size)
{
if (size <1)
{
return NULL;
}
pRoot = new BNode(*pre);
int index = 0;
while (index < size)
{
if (*pre == In[index])break;
index++;
}
//index之前构建左子树, index之后构建右子树
//递归构建
_RebulidBinaryTree(pRoot->pLeft, pre+1, In, index);
_RebulidBinaryTree(pRoot->pRight, pre+index+1, In+index+1, size-index-1); //因为元素个数减少了1个
return pRoot;
}
void Test1()
{
int pre[] = {1,2,4,5,3,6,7};
int order[] = {4,2,5,1,6,3,7};
//BNode* pRoot = CreateTree(pre,order,7);
BNode* pRoot = NULL;
_RebulidBinaryTree(pRoot,pre,order,7);
}
2.层序遍历二叉树
void LevelTraversal(BNode* pRoot)
{
if (pRoot == NULL)
{
return;
}
queue<BNode*> q;
q.push(pRoot);
while (!q.empty())
{
BNode* pCur = q.front();
cout<<pCur->data << " ";
q.pop();
if (pCur->pLeft)
{
q.push(pCur->pLeft);
}
if (pCur->pRight)
{
q.push(pCur->pRight);
}
}
cout << endl;
}
3.给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。
int getZeroCount3(int n)
{
int ret = 0;
while (n)
{
ret += n / 5;
n /= 5;
}
return ret;
}
4.求两个结点的最近公共祖先
答题思路:1、学会提问,好的面试是和面试官愉快的讨论,相互提问。请教。
1.这棵树是二叉树吗?
如果是二叉树,那这棵树是用用什么来表示的?是用双亲表示法、孩子双亲表示法,还是孩子表示法来进行表示的?
2.如果是的话,就可以看成是单链表的相交的问题了。
如果不是的话,那这棵树是二叉搜索树(有序)的话是可以找到公共祖先的。
思路是:
①如果左右两个结点的值均小于根结点的值,则根节点向左继续查找。
②如果左右两个结点的值均大于根结点的值,则根节点向有继续查找。
③如果左右节点的值一个大于根节点的值,一个小于根结点的值,那么根节点就是要求的最小公共祖先。