LeetCode刷题记录.Day30

二叉树的前序遍历

递归遍历法

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& result){
        if(cur == NULL) return; //当前节点为空,终止递归过程
        result.push_back(cur->val); //存储当前节点值
        traversal(cur->left,result); //前序遍历,中左右,先递归左孩子节点
        traversal(cur->right,result);
    }
    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* node = st.top();//node为此时的栈顶,因为先入栈的是右节点,后入栈的左结点,所以top为左结点,遵循中左右
            st.pop();
            result.push_back(node->val); //前序中左右,中结点值入栈
            if(node->right) st.push(node->right);//右,因为栈输出倒序,右结点值入栈
            if(node->left) st.push(node->left);//
        }
        return result;
    }
};

具体思想写在备注。主要理解二叉树遍历顺序和迭代,递归条件的关系

二叉树的后序遍历

递归遍历法

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& result){
        if(cur == NULL) return; //当前节点为空,终止递归过程
        traversal(cur->left,result); //左 前序遍历,中左右,先递归左孩子节点
        traversal(cur->right,result); //
        result.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) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val); //中值先入result
            if (node->left) st.push(node->left); // 相对于前序遍历,这更改一下入栈顺序 
            if (node->right) st.push(node->right); // 空节点不入栈
            //现在栈中顺序为 中 右 左
        }
        reverse(result.begin(), result.end()); //反转顺序变为 左 右 中
        return result;
    }
};

 

二叉树的中序遍历

class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& result){
        if(cur == NULL) return; //当前节点为空,终止递归过程
        traversal(cur->left,result); //左 前序遍历,中左右,先递归左孩子节点
        result.push_back(cur->val); //中 存储当前节点值,当前顺序为中
        traversal(cur->right,result); //
    }
    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;
    }
};

 

posted @ 2022-12-03 21:05  凱風快晴  阅读(26)  评论(0)    收藏  举报