zoukankan      html  css  js  c++  java
  • 二叉树的非递归遍历

    1. 先序遍历的非递归实现

     1 vector<int> pre_order(TreeNode* root){
     2     vector<int> res;
     3     stack<TreeNode* > st;
     4     if(root!=NULL) st.push(root);
     5     while(!st.empty()){
     6         TreeNode* node = st.top();
     7         st.pop();
     8         res.push_back(node->val);
     9         if(node->right != NULL) st.push(node->right);
    10         if(node->left != NULL) st.push(node->left);
    11     }
    12     return res;
    13 }

    2. 中序遍历的非递归实现

     1 vector<int> in_order(TreeNode* root){
     2     vector<int> res;
     3     stack<TreeNode*> st;
     4     if(root != NULL) st.push(root);
     5     TreeNode* cur =root;
     6     while(!st.empty()){
     7         // 如果cur为空,弹出栈顶元素,并将cur设置为弹出节点的右孩子
     8         if(cur == NULL){
     9             res.push_back(st.top()->val);
    10             cur = st.top()->right;
    11             st.pop();
    12         }else        // 否则继续找左孩子
    13             cur = cur->left;
    14         if(cur != NULL)
    15             st.push(cur);
    16     }
    17     return res;
    18 }

    3. 后序遍历的非递归实现

    // 后序遍历的非递归实现(双栈实现)
    vector<int> post_order(TreeNode* root){
        vector<int> res;
        stack<TreeNode*> s1;
        stack<int> s2;
        if(root!=NULL) s1.push(root);
        while(!s1.empty()){
            TreeNode* node = s1.top();
            s1.pop();
            s2.push(node->val);
            if(node->left != NULL) s1.push(node->left);
            if(node->right != NULL) s1.push(node->right);
        }
        while(!s2.empty()){
            res.push_back(s2.top());
            s2.pop();
        }
        return res;
    }

     1 // 后序遍历的非递归实现(单个栈实现)
     2 vector<int> post_order_2(TreeNode* root){
     3     vector<int> res;
     4     stack<TreeNode*> st;
     5     TreeNode* last = root, *cur = NULL;
     6     if(root != NULL) st.push(root);
     7     while(!st.empty()){
     8         cur = st.top();
     9         // 如果左子树没遍历结束
    10         if(cur->left!=NULL && last!=cur->left && last!=cur->right)
    11             st.push(cur->left);
    12         else if(cur->right!=NULL && last!=cur->right)
    13             st.push(cur->right);
    14         else{
    15             last = cur;
    16             res.push_back(st.top()->val);
    17             st.pop();
    18         }
    19     }
    20     return res;
    21 }
  • 相关阅读:
    java运行时异常与一般异常有何异同?
    B+树原理及mysql的索引分析
    ibatis in的用法
    brython的问题
    限流算法的原理
    Java8的CompletionService使用与原理
    命令行相关快捷键
    Java8 异步编排类CompletableFuture
    分布式系统ID生成方案
    curl 命令简介
  • 原文地址:https://www.cnblogs.com/sclczk/p/11146239.html
Copyright © 2011-2022 走看看