二叉树的遍历算法是理解递归和搜索的关键算法,也可以用来思考程序状态问题和分类讨论思想。
二叉树的先序遍历
非递归版本
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(!root) return {};
vector<int> result;
stack<TreeNode*> s;
TreeNode* ptr = root;
while(!s.empty() || ptr){
if(ptr){
result.push_back(ptr->val);
s.push(ptr);
ptr = ptr->left;
}else{
ptr = s.top();s.pop();
ptr = ptr->right;
}
}
return result;
}
};
递归版本
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
dfs(root, result);
return result;
}
private:
void dfs(TreeNode* root, vector<int>& res){
if(root){
dfs(root->left,res);
dfs(root->right, res);
res.push_back(root->val);
}
}
};
中序遍历
非递归版本
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
if(!root) return result;
stack<TreeNode*> s;
TreeNode* ptr = root;
while(!s.empty() || ptr){ // 指针不空或者stack不空
if(ptr){ // 1. 指针不空,stack空 2.指针不空,stack不空
s.push(ptr);
ptr = ptr -> left;
}else{ // 3. 指针空,stack不空 4. 指针空,stack空(这种情况进不了while循环的)
ptr = s.top();s.pop();
result.push_back(ptr->val);
ptr = ptr->right;
}
}
return result;
}
};
递归版本
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
dfs(root, result);
return result;
}
private:
void dfs(TreeNode* root, vector<int>& res){
if(root){
dfs(root->left,res);
res.push_back(root->val);
dfs(root->right, res);
}
}
};
后序遍历
非递归版本
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
if(!root) return {};
stack<pair<TreeNode*,bool>> s;
vector<int> result;
TreeNode* ptr = root;
while(!s.empty() || ptr){
if(ptr){
s.push(make_pair(ptr,false));
ptr = ptr->left;
}else{
auto now = s.top();s.pop();
if(now.second == false){
s.push(make_pair(now.first,true));
ptr = now.first->right;
}else{
result.push_back(now.first->val);
}
}
}
return result;
}
};
递归版本
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
dfs(root, result);
return result;
}
private:
void dfs(TreeNode* root, vector<int>& res){
if(root){
dfs(root->left,res);
dfs(root->right, res);
res.push_back(root->val);
}
}
};