二叉树前、中、后序遍历【非递归】【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.我的直观想法是先把右子树压进去,再把左子树压进去2.然而书上给...
  • xykaiku
  • xykaiku
  • 2017年03月28日 22:54
  • 79

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

树节点结构体: struct TreeNode {     int val;     TreeNode *left;     TreeNode *right; }; 递归建立二叉树: TreeNo...

二叉树前中后序遍历的递归版本和非递归版本、队列实现的层次遍历

/* 数据结构分析与学习专栏 * Copyright (c) 2015, 山东大学 计算机科学与技术专业 学生 * All rights reserved. * 作 者: 高祥...

【11】-java递归和非递归二叉树前序中序后序遍历

二叉树的遍历对于二叉树来讲最主要、最基本的运算是遍历。 遍历二叉树 是指以一定的次序访问二叉树中的每个结点。所谓 访问结点 是指对结点进行各种操作的简称。例如,查询结点数据域的内容,或输出它...

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

复习二叉树的遍历,自己实现了一遍代码,在这里进行下记录,递归和非递归都写出来了,感谢各位的批评指正。节点定义:package com.al;public class Node { public ...

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

中途对于递归总是理不清,后来看了代码和书才想通:递归==递+归:必须要有递归结束条件,可以不是返回值,若调用一个递归的主算法为第0层算法,则从主算法调用递归算法为进入第1层调用,从第i层递归调用本算法...
  • uagvdu
  • uagvdu
  • 2016年04月26日 09:36
  • 377

二叉树前序遍历,中序遍历非递归版本

前序遍历:用栈来存储节点,因为前序遍历是先左子树->根节点->右子树。因此先沿着根节点找最左边的节点,依次压栈,出栈的时候,因为栈这时没有节点的右子树信息。若 某个节点存在右子树,则压入右子树中的节点...

二叉树前序、中序、后序遍历的递归与非递归算法实现

//前序 递归 void preOrderRecursive(Tree * t) { if( !t ) return; visist(t); ...
  • kobep
  • kobep
  • 2013年04月24日 10:50
  • 385
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树前、中、后序遍历【非递归】【LintCode测试平台】
举报原因:
原因补充:

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