二叉树三序遍历-迭代法

本文详细介绍了如何使用迭代法实现二叉树的前序、中序和后序遍历。代码中分别展示了迭代法的实现过程,包括利用栈来辅助遍历,并对后序遍历结果进行了反转以得到正确的顺序。这些方法对于理解和操作二叉树的数据结构非常有帮助。
摘要由CSDN通过智能技术生成

二叉树三序遍历-迭代法

分析:前后写法思想类似,中序写法不同

#include "_myPrint.cpp"
#include "_TreeNode.cpp"
#include "stack"
using namespace std;

class Solution{
public:
    vector<int> inTravel_(TreeNode* root){
        vector<int> res;
        stack<TreeNode*> st;
        if (!root) return res;
        TreeNode* cur = root;
        // 指针空了说明走到底了 栈空了说明未开始或已经结束
        while (!st.empty() || cur){
            if (cur){ // 指针一直往左下走
                st.push(cur);
                cur = cur -> left;
            }else{ // 指针在最左下时,取出栈顶元素,回退一次
                cur = st.top();
                st.pop();
                res.push_back(cur -> val);
                cur = cur -> right;
            }
        }
        return res;
    }
    vector<int> postTravel(TreeNode* root){
        vector<int> res;
        stack<TreeNode*> st;
        if (!root) return res;
        st.push(root);
        while (!st.empty()){
            TreeNode* tmp = st.top();
            res.push_back(tmp -> val);
            st.pop();
            // 改变入栈顺序,结果为中右左
            if (tmp -> left) st.push(tmp -> left);
            if (tmp -> right) st.push(tmp -> right);
        }
        // 反转结果,为左右中
        reverse(res.begin(), res.end());
        return res;
    }
    vector<int> preorder(TreeNode* root){ //迭代法前序
        stack<TreeNode*> st;
        vector<int> res;
        if (!root) return res;
        st.push(root);
        while (!st.empty()){  // 循环终止的条件
            TreeNode* tmp = st.top();
            res.push_back(tmp -> val);
            st.pop();
            // 压入栈先右后左 出栈先左后右
            if (tmp -> right) st.push(tmp -> right);
            if (tmp -> left) st.push(tmp -> left);


        }
        return res;
    }

};

int main(){
    Solution s;
    TreeNode* root = new TreeNode(8);
    TreeNode* l = new TreeNode(7);
    TreeNode* r = new TreeNode(6);

    root->left = l;
    root->right = r;
    vector<int> res = s.inTravel_(root);
    printCollection p;
    p.printVector(res);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值