二叉樹非遞迴遍歷
阿新 • • 發佈:2020-07-29
二叉樹非遞迴遍歷
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)); } } }