当前位置:  编程技术>.net/c#/asp.net

二叉树的遍历算法(详细示例分析)

    来源: 互联网  发布时间:2014-10-20

    本文导语:  代码如下:#include#include#include#includeusing namespace std;struct Node{    int v;    Node *leftChild,*rightChild;    Node():leftChild(NULL),rightChild(NULL){}    Node(int vv):leftChild(NULL),rightChild(NULL)    {        v=vv;    }}; void print(int v){    coutrig...

代码如下:

#include
#include
#include
#include
using namespace std;
struct Node
{
    int v;
    Node *leftChild,*rightChild;
    Node():leftChild(NULL),rightChild(NULL){}
    Node(int vv):leftChild(NULL),rightChild(NULL)
    {
        v=vv;
    }
};

void print(int v)
{
    coutrightChild!=NULL) PreOrderTraverse(n->rightChild,visit);
}

void InOrderTraverse(Node *n, void (* visit)(int))
{
    assert(n!=NULL&&visit!=NULL);
    if(n->leftChild!=NULL) InOrderTraverse(n->leftChild,visit);
    (*visit)(n->v);
    if(n->rightChild!=NULL) InOrderTraverse(n->rightChild,visit);
}

void PostOrderTraverse(Node *n, void (* visit)(int))
{
    assert(n!=NULL&&visit!=NULL);
    if(n->leftChild!=NULL) PostOrderTraverse(n->leftChild,visit);
    if(n->rightChild!=NULL) PostOrderTraverse(n->rightChild,visit);
    (*visit)(n->v);
}
//非递归版本,将递归改成非递归一般都要利用一个栈
//每次访问一个结点后,在向左子树遍历下去之前,利用这个栈记录该结点的右子女(如果有的话)结点的地址,
//以便在左子树退回时可以直接从栈顶取得右子树的根结点,继续右子树的遍历
void PreOrder(Node *n, void (* visit)(int))
{
    stack sta;
    sta.push(n);
    while(!sta.empty())
    {
        Node * t=sta.top();
        sta.pop();
        assert(t!=NULL);
        (*visit)(t->v);
        if(t->rightChild!=NULL) sta.push(t->rightChild);
        if(t->leftChild!=NULL) sta.push(t->leftChild);
    }
}

//非递归中序遍历
void InOrder(Node * n , void (* visit) (int))
{
    stack sta;
    sta.push(n);
    Node * p= n;
    while(!sta.empty()&&p!=NULL)
    {
        p=sta.top();
        while(p!=NULL&&!sta.empty())
        {
            sta.push(p->leftChild);
            p=p->leftChild;
        }
        sta.pop();//弹出空指针
        if(!sta.empty())
        {
            p=sta.top();
            sta.pop();
            (*visit)(p->v);
            sta.push(p->rightChild);
        }
    }
}


//非递归后续遍历

struct StkNode
{
    Node * ptr;
    bool tag;//false=left and true=right
    StkNode():ptr(NULL),tag(false)
    {}
};
void PostOrder(Node * n ,void (*visit) (int))
{
    stack sta;
    StkNode w;
    Node * p = n;
    do {
        while(p!=NULL)
        {
            w.ptr=p;
            w.tag=false;
            sta.push(w);
            p=p->leftChild;
        }
        bool flag=true;
        while(flag&&!sta.empty())
        {
            w=sta.top();
            sta.pop();
            p=w.ptr;
            if(!w.tag)//left,如果从左子树返回,则开始遍历右子树
            {
                w.tag=true;//标记右子树
                sta.push(w);
                flag=false;
                p=p->rightChild;
            }
            else
            {
                (*visit)(p->v);
            }
        }
    } while(!sta.empty());
}

//层序遍历,利用队列
void LevelOrderTraverse(Node * n , void (* visit )(int))
{
    assert(n!=NULL&&visit!=NULL);
    queue que;
    que.push(n);
    while(!que.empty())
    {
        Node * t=que.front();
        (*visit)(t->v);
        que.pop();
        if(t->leftChild!=NULL) que.push(t->leftChild);
        if(t->rightChild!=NULL) que.push(t->rightChild);
    }
}

int main()
{
    Node * head= new Node(0);
    Node * node1= new Node(1);
    Node * node2= new Node(2);
    Node * node3= new Node(3);
    Node * node4= new Node(4);
    Node * node5= new Node(5);
    Node * node6= new Node(6);


    head->leftChild=node1;
    head->rightChild=node2;   
    node1->leftChild=node3;
    node1->rightChild=node4;
    node2->rightChild=node5;
    node4->leftChild=node6;

   
/*    LevelOrderTraverse(head,print);
    cout


    
 
 

您可能感兴趣的文章:

  • jquery遍历checkbox简单示例
  • php遍历目录输出目录及其下的所有文件示例
  • python遍历文件夹并删除特定格式文件的示例
  • Jquery遍历Table表头(示例)
  • php无限遍历目录示例
  • python使用os模块的os.walk遍历文件夹示例
  • jQuery遍历Table应用示例
  • c#递归遍历文件夹示例
  • PHP中多维数组的foreach遍历示例
  • php 遍历指定路径下所有目录与文件(示例)
  • c++遍历lua table示例
  • php无限遍历文件夹示例分享
  • java集合map取key使用示例 java遍历map
  • jquery中each遍历对象和数组示例
  • java使用iterator遍历指定目录示例分享
  • java数组遍历 删除remove(示例代码)
  • python实现dict版图遍历示例
  • php遍历文件夹下的所有文件和子文件夹示例
  • c#基础之数组与接口使用示例(遍历数组 二维数组)
  • Jquery节点遍历next与nextAll方法使用示例
  • 二叉树前序遍历的非递归算法
  • C语言实现二叉树遍历的迭代算法
  • 基于Java实现的图的广度优先遍历算法
  • c++二叉树的几种遍历算法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
  • jquery遍历筛选数组与遍历解析json对象
  • c++类库Boost.Bimap(遍历,插入,查找,删除)参考代码
  • php遍历数组四种方法 php数组遍历实例
  • c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
  • 请问如何遍历目录并拷贝文件?使用bash Shell。
  • java map(HashMap TreeMap)用法:初始化,遍历和排序详解
  • 高分请教高手!目录定时遍历????
  • c++ STL List查找遍历及各成员函数用法详细介绍
  • PHP文件遍历小例子
  • python内置映射类型(mapping type):dict哈希字典遍历方式及其它用法举例
  • C#中遍历DataSet数据集对象实例
  • php无限遍历目录代码
  • php遍历目录与其下所有文件
  • jquery进行数组遍历如何跳出当前的each循环
  • jquery遍历checkbox代码与说明
  • 请问怎么用Java实现一个URL的遍历??急!!!!
  • 请问怎样遍历一个hashtable
  • 在遍历目录的情况下如果遇到符号连接…………
  • Shell programme:怎样遍历整个/目录
  • 遍历其文件动态变化的目录




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3