二叉树非递归遍历
1 前序遍历
void preorder(TreeNode *root, vector<int>& res)
{
stack< pair<TreeNode*, bool> > s;
s.push(make_pair(root, false));
bool visited;
while(!s.empty()) {
root = s.top().first;
visited = s.top().second;
s.pop();
if(root == NULL) {
continue;
}
if(visited) {
res.push_back(root->val);
} else {
s.push(make_pair(root->right, false));
s.push(make_pair(root->left, false));
s.push(make_pair(root, true));
}
}
}
2 中序遍历
void inorder(TreeNode *root, vector<int>& res)
{
stack< pair<TreeNode*, bool> > s;
s.push(make_pair(root, false));
bool visited;
while(!s.empty()) {
root = s.top().first;
visited = s.top().second;
s.pop();
if(root == NULL) {
continue;
}
if(visited) {
res.push_back(root->val);
} else {
s.push(make_pair(root->right, false));
s.push(make_pair(root, true));
s.push(make_pair(root->left, false));
}
}
}
3 后序遍历
void postorder(TreeNode *root, vector<int>& res)
{
stack< pair<TreeNode*, bool> > s;
s.push(make_pair(root, false));
bool visited;
while(!s.empty()) {
root = s.top().first;
visited = s.top().second;
s.pop();
if(root == NULL) {
continue;
}
if(visited) {
res.push_back(root->val);
} else {
s.push(make_pair(root, true));
s.push(make_pair(root->right, false));
s.push(make_pair(root->left, false));
}
}
}