【刷题之路】二叉树的前中后序遍历(非递归)

原创 2016年05月31日 10:42:47

经典算法

class TreeToSequence {
public:
    vector<vector<int> > convert(TreeNode* root) {
        // write code here
        vector<vector<int> > res;
        res.push_back(fronttree(root));
        res.push_back(midtree(root));
        res.push_back(backtree(root));
        return res;
    }
    vector<int> fronttree(TreeNode* root){
        stack<TreeNode*> temp; //将节点放入栈中操作
        vector<int> res;
        TreeNode* cur;
        temp.push(root);
        while(!temp.empty()){
            cur=temp.top();  //每次循环弹出栈顶节点,并将此节点先压入右子节点,再压入左子节点,重复循环
            temp.pop();
            res.push_back(cur->val);
            if(cur->right) temp.push(cur->right);
            if(cur->left) temp.push(cur->left);
        }
        return res;
    }
    vector<int> midtree(TreeNode* root){
        vector<int> res;
        stack<TreeNode*> temp;
        TreeNode* cur;
        temp.push(root);
        cur=temp.top();
        while(!temp.empty()){
            if(cur!=NULL && cur->left!=NULL){ //一直遍历直到最后一个左子节点
                cur=cur->left;
                temp.push(cur);
            }
            else{
                cur=temp.top();  //当前栈顶节点左子结点为空,则弹出栈顶元素,判断该节点的右子节点是否为空
                res.push_back(cur->val); 
                temp.pop();   //简单来说,压入时判断左子节点是否为空,弹出是判断右子节点是否为空
                cur=cur->right;
                if(cur) temp.push(cur);
            }
        }
        return res;
    }
    vector<int> backtree(TreeNode* root){
        vector<int> res;
        stack<TreeNode*> temp1;  //两个栈配合操作
        stack<TreeNode*> temp2;
        TreeNode* cur;
        temp1.push(root);
        while(!temp1.empty()){
            cur=temp1.top();   //1栈顶元素一直压入1栈
            temp1.pop();
            temp2.push(cur);  
            if(cur->left) temp1.push(cur->left);  //若1栈顶元素有孩子,则按左右顺序押入1栈,重复操作
            if(cur->right) temp1.push(cur->right);  
        } 
        while(!temp2.empty()){     //将2栈元素弹出,即为后序遍历
            res.push_back(temp2.top()->val);
            temp2.pop();
        }
        return res;
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

【数据结构】二叉树的前中后序遍历递归和非递归实现

二叉树有很多操作,而二叉树的遍历只是其中的一个基本操作。 二叉树的遍历方式有3种:前序遍历,中序遍历,后序遍历。前中后遍历顺序是根据什么时候遍历根节点来说的。...
  • e_one
  • e_one
  • 2016年01月28日 22:24
  • 5846

算法题目-二叉树前中后序遍历

前序:根-左-右 中序:左-根-右 后序:左-右-根 实现: class TreeNode1 { int val = 0; TreeNode1 left = null; Tre...
  • lynn_Kun
  • lynn_Kun
  • 2017年06月14日 13:46
  • 271

二叉树递归非递归遍历(递归前中后,非递归前中后,层次遍历,凹入打印法等)

由于所有的递归算法都可以借助于堆栈转换成循环结构的非递归算法。方法一:形式化模拟转换。方法二:根据要求解问题的特点设计借助于堆栈的循环结构算法。而此次正好是利用第二种按方法求解。1.1非递归前序遍历:...
  • xiaofei__
  • xiaofei__
  • 2016年05月30日 21:28
  • 4004

【课本】二叉树前序、中序、后序三种遍历的非递归算法

1.先序遍历非递归算法void PreOrderUnrec(Bitree *t){ Stack s; StackInit(s); Bitree *p=t; while ...
  • sky04
  • sky04
  • 2009年09月02日 10:52
  • 6226

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年07月06日 22:14
  • 65172

二叉树后序遍历非递归算法(C/C++语言实现)

二叉树的三种遍历非递归版本是数据结构
  • sgcls
  • sgcls
  • 2014年08月19日 02:08
  • 1582

二叉树后序遍历的非递归实现

目录目录 算法思想 算法实现算法思想因为后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根节点。当用堆栈来存储节点,必须分清返回根节点时,是从左子树返回的,还从右子树返回的。所以,使用...
  • u013161323
  • u013161323
  • 2016年12月29日 11:08
  • 1598

C++实现二叉树前序中序后续遍历的非递归方法总结

前序中序相对简单,不废话,直接代码:
  • njustzj001
  • njustzj001
  • 2014年10月13日 15:16
  • 2483

数据结构-----后序遍历二叉树非递归算法(利用堆栈实现)

一、非递归后序遍历算法思想
  • u011459278
  • u011459278
  • 2014年04月19日 19:41
  • 6282

Lintcode 二叉树后序遍历 非递归形式

给出一棵二叉树,返回其节点值的后序遍历。您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3},1 \ 2 / 3 返回 [...
  • u010510962
  • u010510962
  • 2016年04月18日 16:14
  • 1186
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【刷题之路】二叉树的前中后序遍历(非递归)
举报原因:
原因补充:

(最多只允许输入30个字)