区分前中后序遍历的方法:
前序:中左右
中序:左中右
后序:左右中
记住中间节点的位置
递归法
用递归法需要注意三点:
- 传参和返回值
- 终止条件
- 单层递归的逻辑
前序遍历
- 传参是当前遍历节点cur和记录遍历结果的res,不需要返回值
- 终止条件:当当前遍历节点为空时
- 单层递归的逻辑:先记录中间节点的值,再访问左节点,访问右节点
/**
* Definition for a binary tree node.
* 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 *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res){
if(cur == NULL) return;
res.emplace_back(cur -> val); //中
traversal(cur -> left, res); //左
traversal(cur -> right, res); //右
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
中序和后序调换代码顺序即可。
中序遍历
/**
* Definition for a binary tree node.
* 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 *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res){
if(cur == NULL) return;
traversal(cur -> left, res); //左
res.emplace_back(cur -> val); //中
traversal(cur -> right, res); //右
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
后序遍历
/**
* Definition for a binary tree node.
* 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 *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res){
if(cur == NULL) return;
traversal(cur -> left, res); //左
traversal(cur -> right, res); //右
res.emplace_back(cur -> val); //中
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
非递归法/迭代法
用栈也可以实现二叉树的前中后序遍历。
前序遍历
主要思想:
先取根节点的值,再遍历左子树,再遍历右子树
步骤:
步骤一:取根节点的值
步骤二:遍历左子树
步骤三:遍历右子树
/**
* Definition for a binary tree node.
* 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 *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> res;
while(root != NULL || !st.empty()){
if(root != NULL){
st.emplace(root);
res.emplace_back(root -> val); //步骤一,取根节点的值
root = root -> left; //步骤二,遍历左子树
} else{
TreeNode* tmp = st.top();
st.pop();
root = tmp -> right; //步骤三,遍历右子树
}
}
return res;
}
};
中序遍历
主要思想:
先遍历左子树,再取根节点的值,再遍历右子树
步骤:
步骤一:遍历左子树
步骤二:取根节点的值
步骤三:遍历右子树
/**
* Definition for a binary tree node.
* 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 *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> res;
while(root != NULL || !st.empty()){
if(root != NULL){
st.emplace(root);
root = root -> left; //步骤一,遍历左子树
}else{
TreeNode* tmp = st.top();
st.pop();
res.emplace_back(tmp -> val); //步骤二,取根结点的值
root = tmp -> right; //步骤三,遍历右子树
}
}
return res;
}
};
后序遍历
主要思想:
先遍历左子树,再遍历右子树,最后取根节点的值
步骤:(对主要思想里边的步骤逆序处理)
步骤一:取根节点的值
步骤二:遍历右子树
步骤三:遍历左子树
/**
* Definition for a binary tree node.
* 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 *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> res;
while(root != NULL || !st.empty()){
if(root != NULL){
st.emplace(root);
res.emplace_back(root -> val);
root = root -> right;
}else{
TreeNode* tmp = st.top();
st.pop();
root = tmp -> left;
}
}
reverse(res.begin(), res.end());
return res;
}
};