二叉树的创建与遍历

来源:互联网 发布:linux shell写while 编辑:程序博客网 时间:2024/06/18 08:51

二叉树的创建,递归遍历,非递归遍历,直接看代码

#include<iostream>#include<stack>using namespace std;//结构体typedef struct Node{    char data;    Node *lchild;    Node *rchild;}Node, *Tree;//创建一个结点Node *CreateNode(){    Node*p = new(nothrow)(Node);    if(p==NULL)    {        exit(-1);    }    memset(p, 0, sizeof(Node));    return p;}//创建一棵二叉树Node* CreateTree(char *&s){    if(s==NULL)    {        return NULL;    }    Node*p =NULL;    if(*s != '$')    {        p =  CreateNode();        p->data = *s;        p->lchild = CreateTree(++s);        p->rchild = CreateTree(++s);    }    return p;}//先序void preorder(Node *root){    if(root != NULL)    {        cout<<root->data<<" ";        preorder(root->lchild   );        preorder(root->rchild);    }}//后序void back(Node*p){    if(p)    {        back(p->lchild);                back(p->rchild);        cout<<p->data<<" ";         }}//后序非递归遍历void Back(Node *root){    if(root==NULL)    {        return ;    }    stack<Node*>s;    Node*cur=NULL;    Node*pre =NULL;    cur = root;    s.push(cur);    while(!s.empty())    {        cur = s.top();        if((cur->lchild==NULL && cur->rchild==NULL) ||            (pre !=NULL &&(pre==cur->lchild || pre==cur->rchild)))        {//肯定先访问右孩子,在访问左孩子,因为入栈是先右孩子再左孩子;            //我认为主要是防止只有左孩子,或只有右孩子;            cout<<cur->data<<" ";            pre = cur;            s.pop();        }        else        {            if(cur->rchild != NULL)            {                s.push(cur->rchild);            }            if(cur->lchild != NULL)            {                s.push(cur->lchild);            }        }    }}//中序递归遍历void Inorder(Node*root){    if(root != NULL)    {        Inorder(root->lchild);        cout<<root->data<<" ";        Inorder(root->rchild);    }}//非递归先序遍历void Pre2(Node*root){    if(root == NULL)    {        return ;    }    stack<Node*>s;    Node* p =root;    while(p !=NULL || !s.empty() )    {        while(p !=NULL)        {            s.push(p);            cout<<p->data<<" ";            p=p->lchild ;         }        if(!s.empty())        {            p=s.top();            s.pop();            p=p->rchild;        }    }}//费递归中序遍历void _Inorder(Node*root){    if(root ==NULL)    {        return ;    }    stack<Node*>s;    Node*p = root;    while(p !=NULL || !s.empty())    {        while(p!=NULL)        {            s.push(p);            p=p->lchild;        }        if(!s.empty())        {            p=s.top();            s.pop();            cout<<p->data<<" ";            p=p->rchild;        }    }}int main(){    char *s="fdba$$c$$e$$g$ih$$j$$";    Node*root = CreateTree(s);    back(root);    cout<<endl;    preorder(root);     cout<<endl;    Pre2(root);    cout<<endl;    Inorder(root);    cout<<endl;    Back(root);    cout<<endl;    _Inorder(root);    cout<<endl;    return 0;}
0 0
原创粉丝点击