day14打卡

day14打卡

144. 二叉树的前序遍历

94. 二叉树的中序遍历

145. 二叉树的后序遍历

递归法
前序遍历
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;
    }
};

你可能感兴趣的:(代码,leetcode,算法)