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

原创 2016年08月04日 16:53:25

定义节点

/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/

前序遍历

vector<int> preorderTraversal(TreeNode *root){
    vector<int> result; //最终结果
    stack<TreeNode*> s; //定义栈存放节点,【注意类型】
    while( root != NULL || !s.empty() ){
        /*将所有root节点下的左节点入栈*/
        while( root != NULL ){
            result.push_back(root->val);//访问root
            s.push(root);
            root = root->left;
        }
        /*左节点入栈完毕,可以访问左节点,即栈顶元素*/
        TreeNode * temp = s.top();
        s.pop();//出栈一个元素,即最后一个入栈的左节点
        root = temp->right;//以temp的右节点作为新的根
    }
    return result;
}

中序遍历

与前序遍历差不多,只是访问节点的时间不同:
- 前序遍历每进栈一个左节点立即访问
- 中序遍历当所有左节点入栈完后再访问最后一个左节点

vector<int> inorderTraversal(TreeNode *root){
    vector<int> result;//最终结果
    stack<TreeNode*> s; //定义栈存放节点,【注意类型】
    while(root != NULL || !s.empty()){
        /*将root下所有左节点入栈*/
        while(root != NULL){
            s.push(root);
            root = root->left;
        }
        TreeNode *temp = s.top();
        s.pop();//出栈最后一个左节点
        result.push_back(temp->val);//访问
        root = temp->right;//以temp的右节点作为新的根
    }
    return result;
}

后序遍历

vector<int> postorderTraversal(TreeNode *root){
    vector<int> result;
    stack<TreeNode *> s;
    if( root != NULL ){
        do{
            while(root != NULL ){  //将所有左节点进栈
                s.push(root);
                root = root->left;
            }
            TreeNode *temp = NULL;//指向栈顶节点的前一个已经访问过的节点
            bool flag = true;//标志左孩子已经访问过或为空
            while( !s.empty() && flag ){
                root = s.top();
                if( root->right == temp ){
                    result.push_back(root->val);//访问
                    s.pop();
                    temp = root;
                }else{
                    root = root->right;//指向右节点
                    flag = false;//root的左节点未访问
                }
            }
        }while( !s.empty() );
    }
    return result;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

以前经常说:系统栈爆了怎么办?手写啊!!然而并没有写过一次这次数据结构课介绍了非递归的二叉树遍历算法,后序还没讲,先写了再说先序遍历:1.我的直观想法是先把右子树压进去,再把左子树压进去2.然而书上给...
  • xykaiku
  • xykaiku
  • 2017年03月28日 22:54
  • 101

数据结构 二叉树遍历之前序、中序、后序以及层次遍历实现

二叉树遍历之前序、中序、后序以及层次遍历实现
  • susidian
  • susidian
  • 2015年08月16日 23:38
  • 718

二叉树的创建、先序、中序以及后序遍历

二叉树结点结构与双链表结点结构式类似的,只是
  • zhonghua18517
  • zhonghua18517
  • 2014年06月01日 14:11
  • 1698

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

给出一棵二叉树,返回其节点值的后序遍历。您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3},1 \ 2 / 3 返回 [...
  • u010510962
  • u010510962
  • 2016年04月18日 16:14
  • 1177

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

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

剑指offer面试题6 前序遍历&中序遍历,后序遍历&中序遍历重构二叉树

重构二叉树目前主要是采取递归的方式 目前只能通过前序,中序 或者 后续,中序进行重构 前序和后序是不能够重构的,举个例子:  前序: 1 2 4 7 3 5 6 8  后续: 7 4 2 5 8 6 ...
  • xietingcandice
  • xietingcandice
  • 2015年01月10日 21:58
  • 1159

二叉树前中后序遍历非递归及应用

#include #include #define M 50 typedef struct node{ int data; struct node *llink,*rlink; }BTNod...
  • qq_28792701
  • qq_28792701
  • 2016年01月01日 21:40
  • 110

二叉树前中后序遍历(递归加非递归)

二叉树个各种遍历(递归加非递归)先中后序遍历的操作定义首先明确前中后序遍历二叉树时,结点、左子树、右子树的先后次序。 + 先序遍历,遍历顺序是:父结点、左子树(先序遍历左子树,顺序同理,左子树父节点...
  • u012123160
  • u012123160
  • 2015年03月22日 20:35
  • 440

二叉树前中后序遍历

最近在研究二叉树的遍历,参考了网上的一些资料来写自己的递归算法,最后发现前中后三种顺序反应到代码中去,其实只是插入数据的时机不同。...
  • xly8482
  • xly8482
  • 2017年03月28日 16:27
  • 92
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树前、中、后序遍历【非递归】【LintCode测试平台】
举报原因:
原因补充:

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