二叉树的三种非递归遍历方式

6人阅读 评论(2) 收藏 举报
分类:
#include <iostream>
#include <algorithm>
#include <stack>
#include <cmath>
#include <climits>

using namespace std;

struct Node {
    Node *left;
    Node *right;
    int value;
    Node(int v) : value(v), left(NULL), right(NULL) {}
};

// 非递归遍历二叉树
void PreOrderUnRecursive(Node *root) {
    cout << __func__ << endl;
    stack<Node *> node_stk;
    Node *p_cur = root;
    while (node_stk.size() || p_cur) {
        if (p_cur) {
            cout << p_cur->value << endl;
            if (p_cur->right)
                node_stk.push(p_cur->right);
            p_cur = p_cur->left;
        } else {
            p_cur = node_stk.top();
            node_stk.pop();
        }
    }
}

void InOrderUnRecursive(Node *root) {
    cout << __func__ << endl;
    stack<Node *> node_stk;
    Node *p_cur = root;
    while (node_stk.size() || p_cur) {
        if (p_cur) {
            node_stk.push(p_cur);
            p_cur = p_cur->left;
        } else {
            p_cur = node_stk.top();
            node_stk.pop();

            cout << p_cur->value << endl;

            p_cur = p_cur->right;
        }
    }
}

void PostOrderUnRecursive(Node *root) {
    cout << __func__ << endl;
    stack<Node *> node_stk;
    Node *p_cur = root;
    Node *p_prev = NULL;
    while (node_stk.size() || p_cur) {
        if (p_cur) {
            node_stk.push(p_cur);
            p_cur = p_cur->left;
        } else {
            Node *p_top = node_stk.top();
            if (p_top->right && p_prev != p_top->right) { // 此时左子树一定已经处理完,只需判断是否需要处理右子树
                p_cur = p_top->right;
            } else {
                node_stk.pop();
                cout << p_top->value << endl;
                p_prev = p_top;
            }
        }
    }
}

int main(int argc, char const *argv[])
{
    Node n1(1);
    Node n2(2); Node n3(3);
    Node n4(4); Node n5(5); Node n6(6); Node n7(7);
    n1.left = &n2; n1.right = &n3;
    n2.left = &n4; n2.right = &n5;
    n3.left = &n6; n3.right = &n7;

    PreOrderUnRecursive(&n1);
    InOrderUnRecursive(&n1);
    PostOrderUnRecursive(&n1);

    return 0;
}

查看评论

对于二叉树三种非递归遍历方式的理解

利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回);因此,基于其的二叉树遍历操作深刻的体现了其特性: 1.先入、后出,只...
  • sdulibh
  • sdulibh
  • 2016-01-24 11:25:30
  • 3836

二叉树的递归和非递归方式的三种遍历

二叉树的三种遍历方式,前序遍历,中序遍历,后序遍历,中的前中后都是指的是根节点的访问顺序,这三种遍历方式的概念在这里就不多说了,太普遍了! 二叉树的建立 我们这里以前序遍历为例: 我们先定...
  • woshinannan741
  • woshinannan741
  • 2016-10-16 13:18:57
  • 2738

二叉树几种遍历算法的非递归实现

二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高。下面对于我学习非递归遍历二叉树算法的过程进行总结为了便于理解,这里以下图的二叉树为例,分析...
  • kelvinmao
  • kelvinmao
  • 2016-05-15 11:43:32
  • 6227

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void ma...
  • shiyeqiangldh
  • shiyeqiangldh
  • 2014-06-03 12:22:21
  • 716

二叉树的三种非递归遍历方式。

转自:http://www.slyar.com/blog/bitree-unrecursion-c.html 上周数据结构课在讲二叉树的遍历,老师只讲递归算法,没有什么技术含量,遂自...
  • xiaoxiyu
  • xiaoxiyu
  • 2011-10-27 22:14:43
  • 382

二叉树的四种遍历(递归、非递归)

1、递归遍历/** * 先序遍历 * @param root */ public void printFirstTree(TreeNode root){ ...
  • GYQJN
  • GYQJN
  • 2016-09-30 11:20:33
  • 1939

模板类的练习——二叉树

以下是对二叉树的基本操作的实现,如创建无序二叉树,二叉排序树,三种递归遍历和非递归遍历,查找,插入,删除,以及树叶的计算和树的深度的计算等。#include "iostream.h"#include ...
  • xu123
  • xu123
  • 2004-11-19 11:48:00
  • 1214

二叉树的三种非递归遍历

  • 2009年12月12日 20:32
  • 234KB
  • 下载

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

用递归遍历的优点是算法简单明了,缺点也十分明显:对于栈的消耗比较大。尤其是在嵌入式应用中,嵌入式处理器资源往往有限。每次递归调用,都会涉及到通用寄存器、SP指针、PC指针等的压栈。当树的深度比较大时,...
  • u012914709
  • u012914709
  • 2015-03-20 22:29:56
  • 731
    个人资料
    持之以恒
    等级:
    访问量: 58万+
    积分: 1万+
    排名: 1369