递归法
前中后遍历
递归的思路:
1.确定递归函数的参数和返回值
2.确定终止条件
3.确定单层递归的逻辑
书写方面:前中后序只需交换左中右的顺序
result.push_back(curent->val);//中
Traversal(curent->left,result);//左
Traversal(curent->right,result);//右
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
Traversal(root,result);
return result;
}
void Traversal(TreeNode* curent,vector<int>& result)
{
if(curent==nullptr)
return ;
result.push_back(curent->val);//中
Traversal(curent->left,result);//左
Traversal(curent->right,result);//右
}
};
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
Traversal(root,result);
return result;
}
void Traversal(TreeNode* curent,vector<int>& result)
{
if(curent==nullptr)
return;
Traversal(curent->left,result);//左
result.push_back(curent->val);//中、
Traversal(curent->right,result);//右
}
};
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
Traversal(root,result);
return result;
}
void Traversal(TreeNode* curent,vector<int>& result)
{
if(curent==nullptr)
return ;
Traversal(curent->left,result);//左
Traversal(curent->right,result);//右
result.push_back(curent->val);//中
}
};
迭代法
前中后遍历
由于栈是先进后出,所以输入顺序应为中右左 。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> vec;
if(root==nullptr)
return vec;
st.push(root);
while(!st.empty())
{
TreeNode* node=st.top();
st.pop();
vec.push_back(node->val);//中
if(node->right)
st.push(node->right);//右
if(node->left)
st.push(node->left);//左
}
return vec;
}
};
中序遍历的思路和前后序不同,因为处理顺序和访问顺序不一致。
在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> vec;
TreeNode* curent=root;
while(curent!=nullptr||!st.empty())
{
if(curent!=nullptr)
{
st.push(curent);
curent=curent->left;
}
else
{
curent=st.top();
st.pop();
vec.push_back(curent->val);
curent=curent->right;
}
}
return vec;
}
};
由于前序遍历是根左右,而后序遍历是左右根。
左右根 通过翻转得到->根右左,
可知只需交换一下前序遍历中的左右顺序,然后reverse一下。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> vec;
if(root==nullptr)
return vec;
st.push(root);
while(!st.empty())
{
TreeNode* node=st.top();
st.pop();
vec.push_back(node->val);//中
if(node->left)
st.push(node->left);//左
if(node->right)
st.push(node->right);//右
}
reverse(vec.begin(),vec.end());//翻转
return vec;
}
};
102.二叉树的层序遍历
讲透二叉树的层序遍历 | 广度优先搜索 | LeetCode:102.二叉树的层序遍历
借助于队列
需要注意的点:
vector<vector<int>> result是定义二维数组result。
vector<int> vec必须定义在循环里,因为他要不断的更新每一层。
size是必须定义的,不能直接用que.size。因为在pop的时候que.size是在不停变化的。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
vector<vector<int>> result;
que.push(root);
if(root==nullptr)
return result;
while(!que.empty())
{
int size=que.size();
vector<int> vec;
while(size--)
{
TreeNode* node=que.front();
que.pop();
vec.push_back(node->val);
if(node->left)
que.push(node->left);
if(node->right)
que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};