二叉树迭代遍历(使用栈)
// 前序:根左右 1 2 4 5 3 6 7
// 中序:左根右 4 2 5 1 6 3 7
// 后序:左右根 4 5 2 6 7 3 1
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {};
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {};
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {};
};
void preTraversal(TreeNode *root) {
if(!root) {
return;
}
stack<TreeNode*> st;
TreeNode *p = root;
// 这里一定要判断堆是否为空,不然重复压入压出
while(p || !st.empty()) {
while (p)
{
cout << p->val << " "; // 中
st.push(p);
p = p->left; // 左
}
if(!st.empty())
{
p = st.top();
st.pop();
p = p->right; // 右
}
}
}
void InTraversal(TreeNode *root) {
if(!root) {
return;
}
TreeNode* p = root;
stack<TreeNode*> st;
while(p || !st.empty()) {
while (p)
{
st.push(p);
p = p->left; // 左
}
if(!st.empty())
{
p = st.top();
st.pop();
cout << p->val << " "; // 中
p = p->right; // 右
}
}
}
void BehTraversal(TreeNode *root) {
if(!root) {
return;
}
TreeNode* p = root;
TreeNode* pre = nullptr;
stack<TreeNode*> st;
while(p || !st.empty()) {
while(p)
{
st.push(p);
p = p->left; // 左
}
if (!st.empty()) {
p = st.top(); // 右
if (!p->right || pre == p->right) {
cout << p->val << " ";
st.pop();
pre = p;
p = nullptr;
} else {
p = p->right;
}
}
}
}
int main() {
// 一种列表的初始化方式
TreeNode* root = new TreeNode{1,
new TreeNode{2,
new TreeNode{4,
new TreeNode{8},
new TreeNode{9},
},
new TreeNode{5,
new TreeNode{10},
new TreeNode{11},
},
},
new TreeNode{3,
new TreeNode{6},
new TreeNode{7},
},
};
std::cout << "前序遍历" << endl;
preTraversal(root);
cout << endl;
cout << "中序遍历" << endl;
InTraversal(root);
cout << endl;
cout << "后序遍历" << endl;
BehTraversal(root);
cout << endl;
return 0;
}