二叉树的前序遍历
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() :val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* l, TreeNode* r) :val(x), left(l), right(r) {}
};
class Solution {
public:
vector<int> preorderTraversal_1(TreeNode* root) {
vector<int> ans;
dfs(root, ans);
return ans;
}
void dfs(TreeNode* root, vector<int>& ans)
{
if (root == nullptr)
return;
ans.push_back(root->val);
dfs(root->left, ans);
dfs(root->right, ans);
}
vector<int> preorderTraversal_2(TreeNode* root) {
TreeNode* p = root;
vector<int> ans;
if (root!= nullptr)
{
stack<TreeNode*> st;
st.push(p);
while (!st.empty())
{
p = st.top();
st.pop();
ans.push_back(p->val);
if (p->right != nullptr)
st.push(p->right);
if (p->left != nullptr)
st.push(p->left);
}
}
return ans;
}
};
二叉树的中序遍历
- 递归写法(执行用时4ms,击败39.88%,内存消耗8.2MB,击败50.48%)
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
dfs(root,ans);
return ans;
}
void dfs(TreeNode* root,vector<int>& ans)
{
if(root == nullptr)
{
return ;
}
dfs(root->left,ans);
ans.push_back(root->val);
dfs(root->right,ans);
}
};
- 非递归写法
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
TreeNode* p = root;
stack<TreeNode*>stack;
vector<int> ret;
if(root != nullptr){
while(!stack.empty() || p != nullptr){
if(p != nullptr){
stack.push(p);
p = p->left;
}else{
p = stack.top();
stack.pop();
ret.push_back(p->val);
p = p->right;
}
}
}
return ret;
}
};
二叉树的后序遍历
- 递归写法
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
dfs(root,ans);
return ans;
}
void dfs(TreeNode* root, vector<int>& ans){
if(root == nullptr)
return;
dfs(root->left,ans);
dfs(root->right,ans);
ans.push_back(root->val);
}
};
- 非递归写法
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*>s1;
stack<TreeNode*>s2;
vector<int> ans;
if(root!=nullptr)
{
TreeNode* p = root;
s1.push(p);
while(!s1.empty()){
p = s1.top();
s1.pop();
s2.push(p);
if(p->left!=nullptr)
s1.push(p->left);
if(p->right!=nullptr)
s1.push(p->right);
}
while(!s2.empty()){
p = s2.top();
s2.pop();
ans.push_back(p->val);
}
}
return ans;
}
};