一、 二叉树的遍历顺序
前序:中-左-右
中序:左-中-右
后序:左-右-中
递归方法构造递归函数,迭代方法运用栈遍历
二、两种遍历方式(结果均使用vcetor数组进行存储)
2.1递归方法
通过写递归函数调用递归函数来进行遍历
2.1.1前序遍历
class Solution{
public:
//前序遍历:中-左-右
vector<int> preorderTraversal(TreeNode* root){
vector<int> result;
dfs(root,result);
return result;
}
void dfs(TreeNode* cur,vector<int>& result){
if(cur==NULL) return ;
result.push_back(cur->val);//中
dfs(cur->left,result);//左
dfs(cur->right,result);//右
}
};
2.1.2中序遍历
class Solution {
public:
//中序遍历:左-中-右
vector<int> inorderTraversal(TreeNode* root){
vector<int> result;
dfs(root,result);
return result;
}
void dfs(TreeNode* cur,vector<int>& result){
if(cur==NULL) return ;
dfs(cur->left,result);//左
result.push_back(cur->val);//中
dsf(cur->right,result);//右
}
};
2.1.3后序遍历
class Solution {
public:
//后序遍历:左-右-中
vector<int> postorderTraversal(TreeNode* root){
vector<int> result;
dfs(root,result);
return result;
}
void dfs(TreeNode* cur,vector<int>& result){
if(cur==NULL) return ;
dfs(cur->left,result);//左
dsf(cur->right,result);//右
result.push_back(cur->val);//中
}
};
2.2迭代方法
2.2.1前序遍历
class Solution {
public:
//前序遍历:中-左-右
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root==NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* node=st.top;
result.push_back(node->val);
st.pop();
//出栈方式与入栈方向相反,所以左节点后进先出
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return result;
}
};
2.2.2中序遍历
class Solution {
public:
//中序遍历:左-中-右
vector<int> inorderTraversal(TreeNode* root){
vector<int> result;
stack<TreeNode*> st;
if(root==NULL) result;
TreeNode* node=root;
while(node!=NULL || !st.empty()){
if(node!=NULL){
st.push(node);
node=node->left;
}
else{
node=st.top();
st.pop();
result.push_back(cur->val);
node=node->right;
}
}
return result;
}
};
2.2.3后序遍历
class Solution {
public:
//后序遍历:左-右-中
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL) return result;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if (node->left) st.push(node->left);
if (node->right) st.push(node->right);
}
reverse(result.begin(), result.end()); //前序遍历调整后将结果反转之后就是左右中的顺序了
return result;
}
};