二叉树迭代遍历

PS:以下代码均为C++实现

1.二叉树前序遍历   力扣

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

二叉树迭代遍历_第1张图片

 

class Solution {
public:
    vector preorderTraversal(TreeNode* root) 
    {
        stack st;
        vector str;
        TreeNode* cur=root;
        while(cur||!st.empty())//cur为空或者st为空两者都为空则退出
        {
            while(cur)
            {
                str.push_back(cur->val);//遍历左子树
                st.push(cur);
                cur=cur->left;
            }

            cur=st.top();
            st.pop();
            cur=cur->right;//遍历右子树
        }
        return str;
    }
};

2.二叉树中序遍历  力扣

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

//中序遍历和前序遍历差不多
class Solution {
public:
    vector inorderTraversal(TreeNode* root) 
    {
        stack st;
        vector str;
        TreeNode* cur=root;
        while(cur||!st.empty())
        {
            while(cur)
            {
               
                st.push(cur);
                cur=cur->left;
            }

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

3.二叉树的后序遍历  力扣

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

后序遍历和中序遍历差不多,中间多了一步判断的步骤,只需设置一个空指针,然后判断是否左节点是否为空,不为空则先遍历右节点,空指针的目的是为了防止重复遍历。

class Solution {
public:
    vector postorderTraversal(TreeNode* root) 
    {
        stack st;
        vector nums;
        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)//防止重复遍历
            {
                prev=top;
                st.pop();
                nums.push_back(top->val);
            }
            else
            {
                cur=top->right;
            }
            
        }
        return nums;
    }
};

你可能感兴趣的:(数据结构,算法,c++)