C++——二叉树OJ|二叉树非递归遍历

目录

 二叉树的前序遍历

二叉树的中序遍历 

二叉树的后续遍历 


 二叉树的前序遍历

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

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
TreeNode* cur=root;
stack<TreeNode*> st;
vector<int> v;
while(cur||!st.empty())//如果cur为空,或者栈为空则结束
{
while(cur)
{
    v.push_back(cur->val);
  
    st.push(cur);
      cur=cur->left;
}
//左路节点全部被存入数组
TreeNode* top=st.top();//获取栈顶的节点,也就是最左边的节点
st.pop();//此时将该节点弹出,也就是左节点访问完,现在栈顶是根
cur=top->right;//子问题访问右子树
 }
    return v;
    }
};

思路:遍历内容存在数组中,用栈来进行辅助,先遍历左树,每遍历一个节点,就把该节点的地址放入栈中,把节点的值放入数组中(也就以为着根和左节点都放入里面了),之后左树为空,栈顶是最左边而且下面树的根,之后访问右节点,并把根弹出栈。

二叉树的中序遍历 

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

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> v;
TreeNode*cur=root;
while(cur||!st.empty())
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
//走到最左边的节点,将这个最左边的节放入数组中
TreeNode* top=st.top();//栈顶此时是最左节点
v.push_back(top->val);//最左边的节点放入数组中
st.pop();//pop之后st.top是根节点
cur=top->right;//这个top是最左边的节点,最左边节点访问完,最左边节点已经放入数组,也就是根节点已经放入数组(它的左右节点为空),接下来访问左右节点
    }
    return v;
    }
};

  

二叉树的后续遍历 

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

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        TreeNode* cur=root;
        stack<TreeNode*> st;
        TreeNode* prev=nullptr;//用来记录上一个节点
        vector<int> v;
        while(cur||!st.empty())
        {
            while(cur)
            {
                st.push(cur);
                cur=cur->left;
            }//先把左节点全部放入栈中
            TreeNode* top=st.top();
            //一个节点的右子树不为空:
            //1.右子树没有访问,访问右子树
            //2.右子树访问过了,访问根节点
            if(top->right==nullptr || top->right==prev)//如果右子树为空,或者访问过右子树了,直接把根放入数组
            {
                v.push_back(top->val);
                st.pop();
                     prev=top;
            }
            else//没访问右子树或右子树不为空就去访问右子树
            {
                cur=top->right;
            }
        }
        return v;
    }
};

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
非递归遍历二叉树是指在不使用递归函数的情况下,对二叉树进行遍历的方法。以下是三种非递归遍历二叉树的方法: 1. 非递归中序遍历二叉树 中序遍历二叉树的顺序是:左子树 -> 根节点 -> 右子树。使用栈来保存未被访问的节点,具体步骤如下: 1)从根节点开始,将当前节点入栈。 2)如果当前节点有左子树,则将左子树入栈并进入左子树,重复步骤2,直到左子树为空。 3)从栈中弹出节点,访问该节点。 4)如果该节点有右子树,则将右子树入栈并进入右子树,重复步骤2、3、4。 2. 非递归先序遍历二叉树 先序遍历二叉树的顺序是:根节点 -> 左子树 -> 右子树。使用栈来保存未被访问的节点,具体步骤如下: 1)从根节点开始,将当前节点入栈。 2)从栈中弹出节点,访问该节点。 3)如果该节点有右子树,则将右子树入栈。 4)如果该节点有左子树,则将左子树入栈。 5)重复步骤2、3、4,直到栈为空。 3. 非递归后序遍历二叉树 后序遍历二叉树的顺序是:左子树 -> 右子树 -> 根节点。使用两个栈来实现,具体步骤如下: 1)将根节点入栈1。 2)从栈1中弹出节点,并将该节点入栈2。 3)如果该节点有左子树,则将左子树入栈1。 4)如果该节点有右子树,则将右子树入栈1。 5)重复步骤2、3、4,直到栈1为空。 6)从栈2中依次弹出节点并访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发没有代码多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值