版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_zhuo_/article/details/88594007
对深度优先遍历的理解:
用栈保存我进行这一步就会丢掉的前一步状态。
比如,这里栈保留了双向节点的next指针。使得其next变child之后还能找到原来的next。
再比如,背包问题,栈里保留了如果不加入这个物品时的状态。然后后分别进行:加入,还原,加入其它,深入(即出栈或递归)。
Node *flatten(Node *head) {
Node *it = head;
stack<Node *> stack1;
while (it) {
if (it->child) {
stack1.push(it->next);
it->next = it->child;
it->child->prev = it;
it->child = nullptr;
} else if (!it->next && !stack1.empty()) {
it->next = stack1.top();
if (it->next)
it->next->prev = it;
stack1.pop();
}
it = it->next;
}
return head;
}