二叉树的遍历

来源:互联网 发布:免费域名解析网站软件 编辑:程序博客网 时间:2024/06/13 23:18
1.二叉树结点的定义
typedef char ElemType;typedef struct node{    ElemType data;    struct node *lchild;    struct node *rchild;}BiTree;

2.建树

void CreateBiTree(BiTree *&T){    char ch;    //按先序次序输入二叉树中节点的值(一个字符),空格字符表示空树    scanf("%c",&ch);     if(ch==' ')          T=NULL;    else    {        T=(BiTree *)malloc(sizeof(BiTree));        T->data=ch;               //生成根结点         CreateBiTree(T->lchild);  //构造左子树         CreateBiTree(T->rchild);  //构造右子树     }}

例如如果要建一棵如下图的二叉树,需要输入ABC××D××E×F××(×表示空格)


3.先序遍历递归算法(中序、后序遍历递归算法类似)

void PreOrder(BiTree *T){    if(T!=NULL)    {        printf("%c",T->data);        PreOrder(T->lchild);        PreOrder(T->rchild);    }}

4.先序遍历非递归算法

void PreOrderTraverse(BiTree *T){    stack<BiTree*> s;    if(T==NULL)    {        printf("空树\n");        return;    }    while(T||!s.empty())    {            //让根结点先进栈(用来还原),然后一直向左边搜索         while(T)        {            s.push(T);            printf("%c",T->data);            T=T->lchild;        }        //把最近的根结点还原,遍历其右子树         T=s.top();        s.pop();        T=T->rchild;    }}

5.中序遍历非递归算法,跟先序遍历非递归算法唯一的不同是访问结点的时间不一样

void InOrderTraverse(BiTree *T){    stack<BiTree *> s;    if(T==NULL)    {        printf("空树\n");        return;    }    while(T||!s.empty())    {            //让根结点先进栈(用来还原),然后一直向左边搜索         while(T)        {            s.push(T);            T=T->lchild;        }        //把最近的根结点还原,遍历其右子树         T=s.top();        s.pop();        //在出栈之后访问该结点         printf("%c",T->data);        T=T->rchild;    }}

6.后序遍历非递归算法,添加一个pre指针来判断右子树是否被访问。

void PostOrderTraverse(BiTree *T){    stack<BiTree *> s;        BiTree *pre=NULL;     //指向前一个被访问的节点     if(T==NULL)    {        printf("空树\n");        return;    }    while(T||!s.empty())     {        //一直向左走直到为空         while(T)        {            s.push(T);            T=T->lchild;        }        T=s.top();        //当前节点的右孩子如果为空或者已经被访问过,则访问当前节点         if(T->rchild==NULL||T->rchild==pre)        {            printf("%c",T->data);            pre=T;            s.pop();            T=NULL;        }        //否则访问右孩子         else            T=T->rchild;    }}


 

 

 

二叉搜索树是二叉树的其中一个重要的应用。可以查看之前关于二叉搜索树的笔记:http://www.cnblogs.com/runnyu/p/4677902.html

0 0
原创粉丝点击