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

原创 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;
    }
};

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

相关文章推荐

二叉树非递归前、中、后序遍历

二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但...
  • zj6257
  • zj6257
  • 2017年04月30日 22:48
  • 76

二叉树前、中、后序遍历【非递归】【LintCode测试平台】

定义节点 /** * Definition of TreeNode: * class TreeNode { * public: * int val; ...

二叉树非递归后序遍历

前序、中序、后序的非递归遍历中,要数后序最为麻烦,如果只在栈中保留指向结点的指针,那是不够的,必须有一些额外的信息存放在栈中。 方法有很多,这里只举一种,先定义栈结点的数据结构 typedef s...

二叉树的非递归先序、中序和后序遍历

这个学期一直在忙着准备面试,复习,都没有看新的书,也很久没有写Blog了。 之前写过二叉树的遍历,但是现在回去看实在是不忍直视,不仅写的复杂,而且还不一定正确。现在把二叉树的三种非递归遍历重写一...
  • yk_ee
  • yk_ee
  • 2017年07月01日 14:30
  • 102

二叉树的非递归先序,中序,后序遍历

二叉树的非递归遍历:         先序遍历,中序遍历,后序遍历 #include #include using namespace std; typedef struct node...

利用二叉树的非递归后序遍历求解最近公共祖先问题

通过上一篇的博客我们知道,可以利用栈来实现二叉树的后序遍历。其实这里有一个性质,就是当使用非递归后序遍历时,栈中的元素就是当前节点到根节点的路径。利用这个规律,我们就可以求解最近公共最先问题了。 算法...
  • Ajay666
  • Ajay666
  • 2017年08月05日 22:38
  • 275

二叉树的后序遍历(非递归)

后序遍历的思路如下: (1)只遍历完左子树,右子树尚未遍历,则该节点不出栈,利用栈顶节点找到它的右子树,准备遍历它的右子树。 (2)遍历完右子树,将该节点出栈,并访问它。 (3)设置标志flag...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【刷题之路】二叉树的前中后序遍历(非递归)
举报原因:
原因补充:

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