二叉树前序、中序、后续遍历的迭代和递归,一个模板一网打尽
-
递归
- 前序遍历
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> pre_res; preorder(root,pre_res); return pre_res; } void preorder(TreeNode* root ,vector<int> & res){ if(root == nullptr){ return; } res.emplace_back(root->val); preorder(root->left,res); preorder(root->right,res); } };
- 中序遍历
class Solution { public: void ldr(TreeNode* root, vector<int> & res ){ if (root==nullptr) return ; ldr(root->left , res); res.push_back(root -> val); ldr(root ->right , res); } vector<int> inorderTraversal(TreeNode* root) { vector<int> res; ldr(root,res); return res; } };
- 后序遍历
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> res; postorder(root,res); return res; } void postorder(TreeNode* root, vector<int>& res){ if(root==nullptr) return ; postorder(root->left,res); postorder(root->right,res); res.emplace_back(root->val); } };
-
迭代
- 前序遍历
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> res; postorder(root,res); return res; } void postorder(TreeNode* root, vector<int>& res){ if(root==nullptr) return ; postorder(root->left,res); postorder(root->right,res); res.emplace_back(root->val); } };
- 中序遍历
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; TreeNode* cur = root; stack<TreeNode*> s; while(s.size() || cur!=nullptr){ while(cur){ s.push(cur); cur = cur->left; } TreeNode* temp = s.top(); s.pop(); res.emplace_back(temp->val); cur =temp->right; } return res; } };
- 后序遍历
后续遍历时通过修改前序遍历得到的:
前序遍历顺序:中左右;
将左右的遍历顺序交换得到:中右左;
将结果列表反序输出即:左右中;
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; TreeNode* cur =root; while(s.size() || cur!=nullptr ){ while(cur){ res.emplace_back(cur->val); s.push(cur); cur = cur->right; } TreeNode* temp = s.top(); s.pop(); cur = temp->left; } reverse(res.begin(),res.end()); return res; } };