二叉树的建立及遍历

#include

using namespace std;

struct LinkList

{

    char data;  /*建立二叉树 */

    LinkList *lchild;

    LinkList *rchild;

};

LinkList* CreateLinkList()

{                        /* 创建链表,其实是个先序遍历的形式。之所以不用指针传递参数是因为实参与形参的关系,在这里用指针传参会弄巧成拙*/

    char a;

    LinkList *q;

    cin>>a;

    if(a=='#')

        q=NULL;  /*这里的模式是如果输入字符为#,意味着不存在该结点。递归里的自身函数调用其实是层次上的关系,真正的核心操作是那些非调用的函数操作*/

    else

    {

        q=new LinkList;

        q->data=a;

        q->lchild=CreateLinkList();

        q->rchild=CreateLinkList();

    }

    return q;

}

void Firstbianli(LinkList *q)    /*先序遍历。如果该结点不存在,返回。如果存在,就输出该结点数据,之后向左子树、右子树遍历。*/

{

    if(q==NULL)

        return;

    else

    {

        cout<data;

        Firstbianli(q->lchild);  /*遍历包括两个核心操作,一个是次序、一个是访问。自身函数的调用主要是次序,而非自身函数调用的操作就是访问。*/

        Firstbianli(q->rchild);

    }

}

void Midbianli(LinkList *q)    /*中序遍历*/

{

    if(q==NULL)

        return;

    else

    {

        Midbianli(q->lchild);

        cout<data;              /*无论什么遍历,其实遍历次序是一样的,都是先序遍历,然而不同的是访问次序。*/

        Midbianli(q->rchild);

    }

}

int main()

{

    LinkList *q;

    q=NULL;

    q=CreateLinkList();

    Firstbianli(q);

    cout<<'\n';

    Midbianli(q);

    return 0;

}

你可能感兴趣的:(二叉树的建立及遍历)