代码随想录算法训练营第十四天 | 理论基础, 递归遍历 ,迭代遍历, 统一迭代

本文介绍了如何使用迭代法,特别是利用栈的数据结构,实现二叉树的前序、中序和后序遍历。通过统一的迭代策略,将所有节点入栈并标记遍历状态,简化了代码逻辑。
摘要由CSDN通过智能技术生成

Day14

vector<int>& vec什么情况下需要&,代表对原数组进行操作。

1.大数组的时候,因为不需要再创建一个vector<int>

2.允许对原数组修改

主要记录一下迭代法(其实也就是用栈来模拟递归运行)

前序遍历:

这时首先访问根节点,然后记录的也是根节点,所以可以一块处理,处理根节点,然后将左右放入栈,

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur;
        if(root==NULL) return result;
        st.push(root);
        while(!st.empty()){
            cur=st.top();
            st.pop();
            result.push_back(cur->val);
            if(cur->right) st.push(cur->right);
            if(cur->left) st.push(cur->left);
        }
        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> postorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if(root == NULL) return result;
        st.push(root);
        while(!st.empty()){
            TreeNode* cur=st.top();
            st.pop();
            result.push_back(cur->val);
            if(cur->left) st.push(cur->left);
            if(cur->right) st.push(cur->right);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

统一的迭代法

之前不统一是因为处理顺序和遍历顺序不同,所以考虑将所有的节点都先放入,然后在根节点后面加个空指针(代表已经遍历过了),下次再搜到这个节点就是要输出的时候。

前序

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if(root==NULL) return result;
        st.push(root);
        while(!st.empty()){
            TreeNode* node=st.top();
            if(node!=NULL){
                st.pop();
                if(node->right) st.push(node->right);
                if(node->left) st.push(node->left);

                st.push(node);
                st.push(NULL);
            }
            else{
                st.pop();
                node=st.top();
                st.pop();
                result.push_back(node->val);
            }
        }
        return result;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值