题目要求:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
思路:因为是单向链表,故不可能从后往前遍历,这时候我们就可以考虑栈的先进后出性质,从头到尾将链表压入栈,然后进行出栈操作即可。
此外,我们也可以利用vector的特性,每遍历一个节点,就将该节点从头部插入容器,但是这样是低效率的,因为内部要不断进行数据的移动操作。
class Solution {
public:
vector<int> printListFromTailToHead_my(ListNode* head);
vector<int> printListFromTailToHead(ListNode* head);
};
vector<int> Solution::printListFromTailToHead(ListNode* head)
{
vector<int> vec;
stack<int> temp;
ListNode *p=head;
while(p!=NULL)//入栈
{
temp.push(p->val);
p=p->next;
}
while(!temp.empty())
{
vec.push_back(temp.top());
temp.pop();
}
return vec;
}
vector<int> Solution::printListFromTailToHead_my(ListNode* head)
{
vector<int> temp;
ListNode *p=head;
while(p!=NULL)
{
temp.insert(temp.begin(),p->val);
p=p->next;
}
return temp;
}