二叉树的遍历
二叉树主要有两种遍历方式:
- 深度优先遍历:先往深走,遇到叶子节点再往回走。
- 广度优先遍历:一层一层的去遍历。
从深度优先遍历和广度优先遍历进一步拓展:
- 深度优先遍历
- 前序遍历(递归法,迭代法)
- 中序遍历(递归法,迭代法)
- 后序遍历(递归法,迭代法)
- 广度优先遍历
- 层次遍历(迭代法)
二叉树的定义
// 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.push_back(cur->val);
traversal(cur->left, res);
traversal(cur->right, res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
迭代法:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if(root == NULL) return result;
st.push(root);
while(!st.empty())
{
//中左右
TreeNode* cur = st.top();
st.pop();
result.push_back(cur->val);
if(cur->right != NULL) st.push(cur->right);
if(cur->left != NULL) st.push(cur->left);
}
return result;
}
};
统一迭代法:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root != NULL) st.push(root);
while(!st.empty())
{
TreeNode* cur = st.top();
st.pop();
if(cur != NULL)
{
//中左右
if(cur->right != NULL) st.push(cur->right);
if(cur->left != NULL) st.push(cur->left);
st.push(cur);
st.push(NULL);
}
else
{
cur = st.top();
st.pop();
result.push_back(cur->val);
}
}
return result;
}
};
二叉树的中序遍历
递归法:
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res)
{
if(cur == NULL) return;
//左中右
traversal(cur->left, res);
res.push_back(cur->val);
traversal(cur->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
迭代法:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode* cur = root;
while(cur != NULL || !st.empty())
{
if(cur != NULL)
{
st.push(cur);
cur = cur->left;
}
else
{
//左中右
cur = st.top();
st.pop();
result.push_back(cur->val);
cur = cur->right;
}
}
return result;
}
};
统一迭代法:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root != NULL) st.push(root);
while(!st.empty())
{
TreeNode* cur = st.top();
st.pop();
if(cur != NULL)
{
//左中右
if(cur->right != NULL) st.push(cur->right);
st.push(cur);
st.push(NULL);
if(cur->left != NULL) st.push(cur->left);
}
else
{
cur = st.top();
st.pop();
result.push_back(cur->val);
}
}
return result;
}
};
二叉树的后序遍历
递归法:
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& res)
{
if(cur == NULL) return;
//左右中
traversal(cur->left, res);
traversal(cur->right, res);
res.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
迭代法:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root != NULL) st.push(root);
while(!st.empty())
{
//中右左
TreeNode* cur = st.top();
st.pop();
result.push_back(cur->val);
if(cur->left != NULL) st.push(cur->left);
if(cur->right != NULL) st.push(cur->right);
}
reverse(result.begin(), result.end());
return result;
}
};
统一迭代法:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if(root != NULL) st.push(root);
while(!st.empty())
{
TreeNode* cur = st.top();
st.pop();
if(cur != NULL)
{
//左右中
st.push(cur);
st.push(NULL);
if(cur->right != NULL) st.push(cur->right);
if(cur->left != NULL) st.push(cur->left);
}
else
{
cur = st.top();
st.pop();
result.push_back(cur->val);
}
}
return result;
}
};