二叉树的遍历

原创 2017年04月05日 14:46:22

所谓二叉树的遍历,就是按照某种次序访问二叉树中的每个节点,而且每个节点仅访问一次的过程。以L、N、R分别表示遍历左子树、访问根节点、遍历右子树,则可有NLR、LRN、NRL、RNL、RLN等6中遍历方式。若限定先左后右,则只有三种遍历,分别成为先序遍历、中序遍历和后序遍历,另外还有一种按层序的遍历方式。下面我们采用一个例子来完成的描述二叉树的遍历过程:
这里写图片描述
这是一个递归生成的二叉树,’#’表示节点为空。

#include<iostream>
#include<cstdlib>
#define MaxSize 30
using namespace std;
typedef char ElementType;
typedef struct node
{
    ElementType data;
    struct node *lchild;
    struct node *rchild;
}BTNode;
void CreateBTree(BTNode* &T){  
 //按先序输入二叉树中结点的值(一个字符),空格字符代表空树,  
 //构造二叉树表表示二叉树T。  
 char ch;  
 if((ch=getchar())=='#')T=NULL;//其中getchar()为逐个读入标准库函数  
 else{  
  T=(BTNode*)malloc(sizeof(BTNode));//产生新的子树  
  T->data=ch;//由getchar(A)逐个读入来  
  CreateBTree(T->lchild);//递归创建左子树  
  CreateBTree(T->rchild);//递归创建右子树  
 }  
}//CreateTree   
void PreOrder(BTNode *b)
{
    if(b!=NULL)
    {
        cout<<b->data<<" ";
        PreOrder(b->lchild);
        PreOrder(b->rchild);
    }
}
//先序非递归算法 
void PreOrder1(BTNode *b)
{
    BTNode *St[MaxSize],*p;
    int top=-1;
    if(b!=NULL)
    {
        top++;
        St[top]=b;
        while(top!=-1)
        {
            p=St[top];
            top--;
            cout<<p->data<<" ";
            if(p->rchild!=NULL)
            {
                top++;
                St[top]=p->rchild;
            } 
            if(p->lchild!=NULL)
            {
                top++;
                St[top]=p->lchild;
            }
        }
        cout<<endl;
    }
} 
//中序非递归算法
void InOrder1(BTNode *b)
{
    BTNode *St[MaxSize],*p;
    int top=-1;
    if(b!=NULL)
    {
        p=b;
        while(top>-1||p!=NULL)
        {
            while(p!=NULL)
            {
                top++;
                St[top]=p;
                p=p->lchild;
            }
            if(top>-1)
            {
                p=St[top];
                top--;
                cout<<p->data<<" ";
                p=p->rchild;
            }
        }
        cout<<endl;
    }
} 
void InOrder(BTNode *b)
{
    if(b!=NULL)
    {
        InOrder(b->lchild);
        cout<<b->data<<" ";
        InOrder(b->rchild);
    }
}
void PostOrder(BTNode *b)
{
    if(b!=NULL)
    {
        PostOrder(b->lchild);
        PostOrder(b->rchild);
        cout<<b->data<<" ";
    }
} 
//后序递归算法 
void PostOrder1(BTNode *b)
{
    BTNode *St[MaxSize];
    BTNode *p=b,*q;
    int flag,top=-1;
    if(b!=NULL)
    {
        do
        {
            while(p!=NULL)
            {
                top++;
                St[top]=p;
                p=p->lchild;
            } 
            q=NULL;
            flag=1;
            while(top!=-1&&flag==1)
            {
                p=St[top];
                if(p->rchild==q) 
                {
                    cout<<p->data<<" ";
                    top--;
                    q=p;
                }else
                {
                    p=p->rchild;
                    flag=0;
                }
            }
        }while(top!=-1);
        cout<<endl;
    }
}
//层序遍历 
void LevelOrder(BTNode *b)
{
    BTNode *p;
    BTNode *qu[MaxSize];
    int front,rear;
    front=rear=0;
    rear++;
    qu[rear]=b;
    while(front!=rear)
    {
        front=(front+1)%MaxSize;
        p=qu[front];
        cout<<p->data<<" ";
        if(p->lchild!=NULL)
        {
            rear=(rear+1)%MaxSize;
            qu[rear]=p->lchild;
        }
        if(p->rchild!=NULL)
        {
            rear=(rear+1)%MaxSize;
            qu[rear]=p->rchild;
        }
    }
}
int main()
{
    BTNode *b;
    CreateBTree(b);
    cout<<"先序遍历结果:"<<endl;
    //PreOrder(b);
    PreOrder1(b);
    cout<<"中序遍历结果:"<<endl;
    //InOrder(b);
    InOrder1(b);
    cout<<endl;
    cout<<"后序遍历结果:"<<endl;
    //PostOrder(b); 
    PostOrder1(b);
    cout<<"层序遍历结果:"<<endl;
    LevelOrder(b);
    return 0;
}

我们采用两种方式遍历二叉树,一种是递归方式,一种采用非递归方式(栈和队列)。
运行程序:
这里写图片描述
各种遍历得到的结果如图所示:
这里写图片描述
至此二叉树的遍历就已经讲完了,希望对大家有所帮助!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树的遍历算法

  • 2015年01月11日 11:42
  • 1KB
  • 下载

java版本二叉树_中序遍历(左根右,从小到大打印)

例一: public class BinaryTreeDemo { public static void main(String[] args) { BinaryTree bt = new ...

二叉树类实现,包含层次遍历

  • 2015年05月17日 13:12
  • 210KB
  • 下载

二叉树的各种遍历操作

  • 2014年11月18日 20:57
  • 3KB
  • 下载

java语言实现二叉树的前序、中序与后序遍历(递归与非递归)

import java.util.*; public class BinaryTree {  private BinaryTree lchild;  private BinaryTree rch...
  • chj97
  • chj97
  • 2011年10月05日 21:25
  • 14514

二叉树的三种遍历

  • 2015年08月20日 22:13
  • 2KB
  • 下载

二叉树及其遍历

  • 2016年01月17日 15:57
  • 1KB
  • 下载

二叉树的前序、中序、后序三种遍历的六种实现方式(递归、非递归)(C++)

实现语言:C++ 存储方式:链式存储 struct TreeNode{ int val; TreeNode *left; TreeNode *right; ...

二叉树的三种遍历

  • 2015年06月09日 15:08
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的遍历
举报原因:
原因补充:

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