day14打卡
递归法
前序遍历
class Solution {
public:
vector<int> ans;
void preorder(TreeNode* root)
{
//出口
if(root == nullptr) return;
//循环体
ans.push_back(root->val);
preorder(root->left);
preorder(root->right);
}
vector<int> preorderTraversal(TreeNode* root) {
preorder(root);
return ans;
}
};
中序遍历
class Solution {
public:
vector<int> ans;
void inorder(TreeNode* root)
{
//出口
if(root == nullptr) return;
//循环体
inorder(root->left);
ans.push_back(root->val);
inorder(root->right);
}
vector<int> inorderTraversal(TreeNode* root) {
inorder(root);
return ans;
}
};
后序遍历
class Solution {
public:
vector<int> ans;
void postorder(TreeNode* root)
{
//出口
if(root == nullptr) return;
//循环体
postorder(root->left);
postorder(root->right);
ans.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
postorder(root);
return ans;
}
};
迭代法
前序遍历
中-》左-》右
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
//首先判断根节点是不是为空,如果是直接返回
if(root == nullptr) return ans;
//使用栈把数中的值取出来
stack<TreeNode*>st;
TreeNode* cur = root;
while(!st.empty() || cur != nullptr)
{
//先取出左子树的节点
while(cur != nullptr)
{
st.push(cur);
ans.push_back(cur->val);
cur = cur->left;
}
TreeNode* top = st.top();
st.pop();
if(top->right != nullptr) cur = top->right;
}
return ans;
}
};
中序遍历
与前序遍历相比,仅仅是改变了向数组ans中push元素的顺序,左-》中-》右
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
//判断根节点是不是为空
if(root == nullptr) return ans;
//使用栈来保存
stack<TreeNode*> st;
TreeNode* cur = root;
while(!st.empty() || cur != nullptr)
{
//先取左子树
while(cur != nullptr)
{
st.push(cur);
cur = cur->left;
}
TreeNode* top = st.top();
ans.push_back(top->val);
st.pop();
if(top->right != nullptr) cur = top->right;
}
return ans;
}
};
后序遍历
左-》右-》中
与前两个相比,增加了一个标志位,标记该节点的val是否已经取过了。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
//先判断根节点是否空
if(root == nullptr) return ans;
TreeNode* cur = root;
TreeNode* prev = nullptr;
stack<TreeNode*> st;
while(!st.empty() || cur != nullptr)
{
while(cur != nullptr)
{
st.push(cur);
cur = cur->left;
}
TreeNode* top = st.top();
st.pop();
if(top->right == nullptr || prev == top->right)
{
ans.push_back(top->val);
prev = top;
}
else
{
//如果右节点不为空,
//或者当前节点没有取过val就要把这个根节点再次push到栈中
st.push(top);
cur = top->right;
}
}
return ans;
}
};