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

先序遍历:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode *root) {
        stack<TreeNode *> st;
        vector<int> result;
        if(root != NULL)
            st.push(root);
        else
            return result;
        while(!st.empty()){
            TreeNode *node = st.top();
            st.pop();
            result.push_back(node->val);
            if(node->right != NULL)
                st.push(node->right);
            if(node->left != NULL)
                st.push(node->left);
        }
        return result;
    }
};

中序遍历:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> result;
        stack<TreeNode *> st;
        if(root == NULL)
            return result;
        if(root->right != NULL)
            st.push(root->right);
        st.push(root);
        TreeNode* node = root->left;
        while(node != NULL){
            if(node->right != NULL)
                st.push(node->right);
            st.push(node);
            node = node->left;
        }
        while(!st.empty()){
            node = st.top();
            st.pop();
            result.push_back(node->val);
            if(!st.empty() && st.top() == node->right){
                node = st.top();
                st.pop();
                while(node != NULL){
                    if(node->right != NULL)
                        st.push(node->right);
                    st.push(node);
                    node = node->left;
                }
            }
        }
        return result;
    }
};

后序遍历:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> result;
        stack<TreeNode *> st;
        TreeNode *node = root;
        if(node == NULL)
            return result;
        st.push(node);
        if(node->right != NULL)
            st.push(node->right);
        if(node->left != NULL)
            st.push(node->left);
        TreeNode *lastNode = NULL;
        while(!st.empty()){
            node = st.top();
            st.pop();
            if(node->left == NULL && node->right == NULL){
                result.push_back(node->val);
                lastNode = node;
            }
            else if(lastNode != NULL && (lastNode == node->left || lastNode == node->right)){
                result.push_back(node->val);
                lastNode = node;
            }
            else {
                st.push(node);
                if(node->right != NULL)
                st.push(node->right);
                if(node->left != NULL)
                    st.push(node->left);
            }
        }
        return result;
    }
};
时间: 2024-10-29 01:05:30

二叉树的非递归遍历(先序, 中序, 后序)的相关文章

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

[前文] 二叉树的非递归遍历有 先序遍历.中序遍历 .后续遍历 和 层序遍历. 非递归算法实现的基本思路:使用堆栈.而层序遍历的实现:使用队列. 如下图所示的二叉树: 前序遍历顺序为:ABCDE (先访问根节点,然后先序遍历其左子树,最后先序遍历其右子树) 中序遍历顺序为:CBDAE (先中序遍历其左子树,然后访问很节点,最后中序遍历其右子树) 后续遍历顺序为:CDBEA (先后序遍历其左子树,然后后续其右子树,最后访问根节点) 层序遍历顺序为:ABECD (由上至下.从左到右遍历二叉树) [准

二叉树的非递归遍历--京东2015笔试回忆

题目回忆: C/C++研发试卷:偏重于数据结构的考察,编程题有2题+1题附加题: 1.输入整数n,求m,m>9,m中各个数位的乘积=n的最小整数;如n=36,m=49; 2.二叉树前序遍历的非递归实现(本文的总结) 3.求第n个数,这个序列满足(2^i)*(3^j)*(5^k),前7个为:2,3,4,5,6,8,10 .... 小题有基本的数据结构.程序运行结果.SQL题目. 4.删除表格用DROP命令,死锁产生的条件: 4.1互斥使用(资源独占) 一个资源每次只能给一个进程使用 4.2.不可强

二叉树之非递归遍历

1.二叉树的遍历 为什么要有遍历操作:将线性结构-------->非线性结构: 将递归程序-------->非递归程序: 2.二叉树的三种递归遍历: 先序遍历:先访问根(父)结点,在访问左分支,最后访问右分支: 中序遍历:先访问左分支,在根结点,最后右分支: 后序遍历:先访问左分支,在访问右分支,最后访问根节点: 所有程序皆正确测试过,后面将给完整程序和测试程序,测试结果. 以下就是递归遍历,先序,中序,后序: 下面的都是在类外定义的函数,所以为模板函数: //先序遍历 template<

二叉树的非递归遍历及算法分析

二叉树介绍 二叉树是一类重要的数据结构.二叉树常被用于实现二叉查找树和二叉堆.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree). 一种二叉树结点定义: struct bit_node { chardata; structbit_node *lchild,*rchild; }; 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次.由于二叉树是

二叉树的非递归遍历(转)

原文地址 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点. 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问. 1.递归实现 void pr

二叉树的非递归遍历C语言实现

腾讯面试中被问到二叉树的非递归遍历实现,当时记得不太清楚,回来专门复习了非递归的实现,整理代码如下: //采用二叉链表存储方式的二叉树,非递归中序遍历C语言实现代码 #include<stdio.h> #include <malloc.h> //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status是

(转)二叉树的非递归遍历

转自: 二叉树的非递归遍历 http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都

二叉树的非递归遍历(转载)

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点. 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问. 1.递归实现 void preOrde

好久没更新了,哪里不对!更新二叉树的非递归遍历

#include <iostream> #include <stack> using namespace std; typedef struct Node { Node* lchild; Node* rchild; int data; }BNode,BTree; void visit(Node*); void inorder(BTree *root) { BNode * p = root; stack<Node*> s; if(p||!s.empty()) { s.pu

树的非递归遍历——前序、中序、后序

树的递归遍历非常简单,也是写树的遍历时最常用的写法.但是我发现自己对树的非递归遍历并不十分熟悉,所以把三种非递归遍历都写了一遍,以后看到这篇记录博客也可以帮助自己好好回想熟悉一下. Leetcode对应习题:前序,中序,后序. 相对而言,这三种非递归遍历的难度--前序 < 中序 < 后序. 对于第三种(非递归后序遍历)方法,只要稍微调整下第18~19行三个节点push的顺序,就可以实现前中后序的遍历. 树的非递归前序: 1 class Solution { 2 public: 3 vector