这道题是京东推荐搜索部面试的时候做的,说非递归实现可加分,当时题目较多,也就写了递归实现。面试的时候大哥问我有非递归实现方法不。
当时顺口提了句可以构造栈,其实思想就是用自己定义的栈模拟递归调用过程编译系统实现的变量栈。回来后也没有想到更好的办法。定义几个栈,也算是实现了非递归的要求吧。不知道有没有更简单的办法。
void BuildPostOrderByPreandIn(int PreOrder[], int InOrder[], int PostOrder[], int length)
{
if (PreOrder == NULL || InOrder == NULL || PreOrder == NULL || length < 0)
{
return;
}
stack<int*> preStack;
stack<int*> inStack;
stack<int*> postStack;
stack<int> lenStack;
preStack.push(PreOrder);
inStack.push(InOrder);
postStack.push(PostOrder);
lenStack.push(length);
while (lenStack.size())
{
int len = lenStack.top();
lenStack.pop();
int* pPre = preStack.top(); int* pIn = inStack.top(); int* pPost = postStack.top();
preStack.pop(); inStack.pop(); postStack.pop();
int head = pPre[0];
int mid = 0;
for (; mid < length; mid++)
{
if (head == pIn[mid])
{
break;
}
}
pPost[len-1] = head;
int left_len = mid; int right_len = len - 1 - mid;
if (left_len > 0)
{
preStack.push(pPre+1);
inStack.push(pIn);
postStack.push(pPost);
lenStack.push(left_len);
}
if (right_len > 0)
{
preStack.push(pPre + mid + 1);
inStack.push(pIn + mid + 1);
postStack.push(pPost + mid);
lenStack.push(right_len);
}
}
}