时间: 2020-06-14 15:32
void bl(btree* head) { //传入根指针
if (!head) { //根指针为空则 return
return;
}
stack<btree*> sta; //主栈
stack<btree*> help; //辅助栈
sta.push(head); //根节点入栈
while (!sta.empty()) { //栈非空
help.push(sta.top());//将待出栈的节点压入辅助栈
head = sta.top(); //刷新 head
sta.pop(); //主栈栈顶元素出栈
if (head->left) { //先压左
sta.push(head->left);
}
if (head->right) { //再压右
sta.push(head->right);
}
}
while (!help.empty()) { //全部入栈之后再从辅助栈依次出栈
printf("%d ", help.top()->data);
help.pop();
}
}
总结:
栈方式实现头左右, 为前序遍历, 栈方式实现头右左, 逆过来就是左右头, 也就是后序遍历的方式, 因此可以在栈方式实现前序遍历的基础上, 稍加改动, 让左子节点先入栈, 右子节点再入栈, 然后将出栈元素用一个辅助栈接收, 最后再将辅助栈中的元素全部出栈, 便是后续遍历.