树的前中后序非递归遍历
非递归遍历统一用栈处理
1.前
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL) return result;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top(); // 中
st.pop();
result.push_back(node->val);
if (node->right) st.push(node->right); // 右(空节点不入栈)
if (node->left) st.push(node->left); // 左(空节点不入栈)
}
return result;
}
2.中
2.1记住按左中右的逻辑
借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素
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;
}
3.后
3.1 利用前序的代码 后反转数组是
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL) return result;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if (node->left) st.push(node->left);
if (node->right) st.push(node->right);
}
return reverse(result); // 前序改成中右左后倒转
}
void orderTraversal(BTree* root) // 王道版本
{
Stack<BTree*> S;
BTree* p = root,r;
while(p || !S.empty())
{
if(p)
{
push(p);
p = p->left;
}
else{
p = S.top();
if(p->right != null && p->right != r)
p = p->right;
else
{
p = S.pop();
visit(p);
r = p;
p = null;
}
}
}
}