前中后序遍历的非递归实现

目录

1.前序遍历

2.中序遍历

3.后序遍历


1.前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

前中后序遍历的非递归实现_第1张图片

 

思路:

前中后序遍历的非递归实现_第2张图片

 

class Solution {
public:
    vector preorderTraversal(TreeNode* root) {
        stack st;
        vector v;
        TreeNode* cur=root;
        while(cur||!st.empty())
        {
            //走完左路径的节点,同时入栈
            while(cur)
            {
                v.push_back(cur->val);
                st.push(cur);
                cur=cur->left;
            }
            //依次按栈中的节点,访问右子树
            cur=st.top()->right;
            st.pop();
        }
        return v;
    }
};

2.中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)

前中后序遍历的非递归实现_第3张图片

 

思路:前序遍历简单变一下,不赘述

class Solution {
public:
    vector inorderTraversal(TreeNode* root) {
        stack st;
        vector v;
        TreeNode* cur=root;
        while(cur||!st.empty())
        {
            while(cur)
            {

                st.push(cur);
                cur=cur->left;
            }
            cur=st.top()->right;
            v.push_back(st.top()->val);
            st.pop();
        }
        return v;
    }
};

3.后序遍历

145. 二叉树的后序遍历 - 力扣(LeetCode)

前中后序遍历的非递归实现_第4张图片

思想:

前中后序遍历的非递归实现_第5张图片 

class Solution {
public:
    vector postorderTraversal(TreeNode* root) {
        stack st;
        vector v;
        TreeNode* cur=root;
        TreeNode* prev=nullptr;
        while(cur||!st.empty())
        {
            //做路径节点,同是入栈
            while(cur)
            {
                st.push(cur);
                cur=cur->left;
            }
            TreeNode* top=st.top();
            //走到这节点左子树为空,如果有子树为空或者节点的右孩子为上一个访问的节点,那么可以访问
            if(top->right==nullptr||top->right==prev)
            {
                v.push_back(top->val);
                st.pop();
                prev=top;
            }
            else
            {
                cur=top->right;
            }
        }
        return v;
    }
};

 

你可能感兴趣的:(c++,leetcode,算法)