迭代前中后序遍历二叉树

迭代前中后序遍历二叉树

主要思想是将树先按照一定顺序扫一遍 边扫边压入栈结构即可,但是一定要注意压入顺序,一般来说越晚输出的就越先入栈。
画了两个图,忘记怎么做了就把自己画的图再跟着步骤走一遍就知道了!!!!!

先上代码:

节点结构
  struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
  };

前序遍历

    void preOrderUnRecur(TreeNode * head){
        if(head!=nullptr){
            stack<TreeNode*> myStack;
            myStack.push(head);
            while(!myStack.empty()){
                head=myStack.top();
                vc1.push_back(head->val);//cout<<head->val;
                myStack.pop();
                if(head->right!=nullptr)
                    myStack.push(head->right);
                if(head->left!=nullptr)
                    myStack.push(head->left);
            }
            
        }
    }

中序遍历

    void inOrderUnRecur(TreeNode* head){
        if(head!=nullptr){
            stack<TreeNode*> myStack;
            while(!myStack.empty()||head!=nullptr){
                if(head!=nullptr){
                    myStack.push(head);
                    head=head->left;
                }
                else{
                    head=myStack.top();
                    myStack.pop();
                    vc2.push_back(head->val);//cout<<head->val;
                    head=head->right;
                }
            }
        }
    }

后序遍历

    void posOrderUnRecur(TreeNode* head){
        if(head!=nullptr){
            stack<TreeNode*> s1,s2;
            s1.push(head);
            while(!s1.empty()){
                head=s1.top();
                s1.pop();
                s2.push(head);
                if(head->left!=nullptr){
                    s1.push(head->left);
                }
                if(head->right!=nullptr){
                    s1.push(head->right);
                }
            }
            while(!s2.empty()){
                vc3.push_back(s2.top()->val);//cout<<head->val
                s2.pop();
            }
            
        }
        
    }

过程
前序遍历
在这里插入图片描述

中序遍历
在这里插入图片描述

后序遍历太长了就没写

例题:
牛客的一个简单题

结果

class Solution {
public:
    /**
     *
     * @param root TreeNode类 the root of binary tree
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > threeOrders(TreeNode* root) {
        // write code here
        preOrderUnRecur(root);
        inOrderUnRecur(root);
        posOrderUnRecur(root);
        vector<vector<int>> res;
        res.push_back(vc1);
        res.push_back(vc2);
        res.push_back(vc3);
        return res;
    }
    
private:
    vector<int> vc1;
    vector<int> vc2;
    vector<int> vc3;
    
    void preOrderUnRecur(TreeNode * head){
        if(head!=nullptr){
            stack<TreeNode*> myStack;
            myStack.push(head);
            while(!myStack.empty()){
                head=myStack.top();
                vc1.push_back(head->val);//cout<<head->val;
                myStack.pop();
                if(head->right!=nullptr)
                    myStack.push(head->right);
                if(head->left!=nullptr)
                    myStack.push(head->left);
            }
            
        }
    }
    void inOrderUnRecur(TreeNode* head){
        if(head!=nullptr){
            stack<TreeNode*> myStack;
            while(!myStack.empty()||head!=nullptr){
                if(head!=nullptr){
                    myStack.push(head);
                    head=head->left;
                }
                else{
                    head=myStack.top();
                    myStack.pop();
                    vc2.push_back(head->val);//cout<<head->val;
                    head=head->right;
                }
            }
        }
    }
    
    void posOrderUnRecur(TreeNode* head){
        if(head!=nullptr){
            stack<TreeNode*> s1,s2;
            s1.push(head);
            while(!s1.empty()){
                head=s1.top();
                s1.pop();
                s2.push(head);
                if(head->left!=nullptr){
                    s1.push(head->left);
                }
                if(head->right!=nullptr){
                    s1.push(head->right);
                }
            }
            while(!s2.empty()){
                vc3.push_back(s2.top()->val);//cout<<head->val
                s2.pop();
            }
            
        }
        
    }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值