递归能干的事情,我栈也能干!!
递归的实质就是系统栈的实现,虽然代码上简洁,但是运行效率并不高,重点是递归的写法无法准确的处理细节,无论是用三段式宏观上写代码,还是整体考虑,遇到复杂的递归过程总是出现bug。
所以我们不仿将递归转化为自己实现栈。
如下,以二叉树的前序遍历为创建栈的模板。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> ans;
if (root != NULL) st.push(root);
while (!st.empty()) {
auto head = st.top(); // 中
st.pop();
ans.push_back(head->val);
if (head->right) st.push(head->right); // 右(空节点不入栈)
if (head->left) st.push(head->left); // 左(空节点不入栈)
}
return ans;
}
};
1.创建stack
2.载入首个节点
3.制定处理顺序,先载入那个节点,或是先弹出当前节点。
对比如下:
lass Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur != NULL || !st.empty()) {
if (cur != NULL) { // 指针来访问节点,访问到最底层
st.push(cur); // 将访问的节点放进栈
cur = cur->left; // 左
} else {
cur = st.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据)
st.pop();
result.push_back(cur->val); // 中
cur = cur->right; // 右
}
}
return result;
}
};