二叉树前中后序遍历
二叉树定义
1 2 3 4 5 6
| struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };
|
二叉树的前序遍历
题目链接:144. 二叉树的前序遍历
递归遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public: void traversal(TreeNode* cur, vector<int>& vec) { if (cur == NULL) return; vec.push_back(cur->val); traversal(cur->left, vec); traversal(cur->right, vec); } vector<int> preorderTraversal(TreeNode* root) { vector<int> result; traversal(root, result); return result; } };
|
迭代遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; if(root==NULL) return res; s.push(root); while(!s.empty()){ TreeNode* node= s.top(); s.pop(); res.push_back(node->val); if(node->right) s.push(node->right); if(node->left) s.push(node->left); } return res; } };
|
统一迭代法
每次加入一个右中左,接着将中全部输出,最后再按顺序输出栈里的内容,思路很直观,另外两种遍历也是如此。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> result; stack<TreeNode*> st; if (root != NULL) st.push(root); while (!st.empty()) { TreeNode* node = st.top(); if (node != NULL) { st.pop(); if (node->right) st.push(node->right); if (node->left) st.push(node->left); st.push(node); st.push(NULL); } else { st.pop(); node = st.top(); st.pop(); result.push_back(node->val); } } return result; } };
|
二叉树的中序遍历
题目链接:94. 二叉树的中序遍历
递归遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public: void traversal(TreeNode* cur, vector<int>& vec) { if (cur == NULL) return; traversal(cur->left, vec); vec.push_back(cur->val); traversal(cur->right, vec); } vector<int> preorderTraversal(TreeNode* root) { vector<int> result; traversal(root, result); return result; } };
|
迭代遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; TreeNode* cur = root; while (cur != nullptr || !s.empty()) { while (cur != nullptr) { s.push(cur); cur = cur->left; } cur = s.top(); s.pop(); res.push_back(cur->val); cur = cur->right; } return res; } };
|
统一迭代法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack<TreeNode*> st; if (root != NULL) st.push (root); while (!st.empty()) { TreeNode* node = st.top(); if (node != NULL) { st.pop(); if (node->right) st.push(node->right); st.push(node); st.push(NULL); if (node->left) st.push(node->left); } else { st.pop(); node = st.top(); st.pop(); result.push_back(node->val); } } return result; } };
|
二叉树的后序遍历
题目链接:145. 二叉树的后序遍历
递归遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public: void traversal(TreeNode *root,vector<int>& res){ if(root==NULL) return; traversal(root->left,res); traversal(root->right,res); res.push_back(root->val); } vector<int> postorderTraversal(TreeNode* root) { vector<int> re; traversal(root,re); return re; } };
|
迭代遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; if(root==NULL) return res; s.push(root); while(!s.empty()){ TreeNode* node=s.top(); s.pop(); res.push_back(node->val); if(node->left) s.push(node->left); if(node->right) s.push(node->right); } reverse(res.begin(),res.end()); return res; } };
|
统一迭代法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public: vector<int> postorderTraversal(TreeNode* root) { stack<TreeNode*> s; vector<int> res; if(root==NULL) return res; s.push(root); while(!s.empty()) { TreeNode* node =s.top(); if(node!=NULL) { s.pop(); s.push(node); s.push(NULL); if(node->right) s.push(node->right); if(node->left) s.push(node->left); } else{ s.pop(); node =s.top(); s.pop(); res.push_back(node->val); } } return res; } };
|