二叉树的创建与遍历(二叉树遍历模板)

[ 二叉树的创建与遍历]

初学二叉树,感觉之前链表掌握不熟练导致接受有点难,现在做一些总结。
本题其实就是根据给出的前序遍历(包括空子树),写出相应的前序、中序和后序遍历。
废话不多说,先看看题目:

二叉树的创建与遍历

Description
下面给出了教材中算法6.4所示的算法。

Status   CreateBiTree ( BiTree  &T )
{
     scanf(&ch); 
     if (ch==^)   T=NULL// ^表示NULL
     else
       {
            if(!(T=(BitNode  *)malloc(sizeof(BitNode)))) 
                       exit(OVERFLOW);
            T—>data =ch;
            CreateBiTree (T—>lchild );
            CreateBiTree (T—>rchild );
        }
   return   OK;
}

该算法按照给出的先序序列顺序建立二叉树的二叉链表。要求实现该算法。
Input
包含多组测试数据。每组测试数据一行,给出二叉树的先序遍历序列(至少1个结点)。

Output
输出二叉树的先序,中序和后序遍历结果。

Sample Input
ABC ^ ^ DE ^ G ^ ^ F ^ ^ ^
A ^ ^
AB ^ ^ C ^ ^

Sample Output
ABCDEGF
CBEGDFA
CGEFDBA
A
A
A
ABC
BAC
BCA
————————————————————————————————————————
首先讲讲各种遍历方法:(这里只讲递归,并不讲用栈的方式)

1.前序遍历: 遍历顺序为:根->左子树->右子树.

代码为

     typedef struct node
        {
            char data;
            struct node* left;
            struct node* right;
        }tree;
    void preorder(tree* &t)
    {
        if(t!=NULL)//若为空,则直接跳过
        {
            cout<<t->data;//先输出根节点的数据,然后依次遍历左子树和右子树;
            preorder(t->left);
            preorder(t->right);
        }
    }

2.中序遍历: 遍历顺序为:左子树->根->右子树.

代码如下:(之后省略树的结构体代码)

    void inorder(tree* &t)
    {
        if(t!=NULL)
        {
            inorder(t->left);//先遍历左子树,直到不再有左子树遍历
            cout<<t->data;//然后输出左子树,遍历右子树;
            inorder(t->right);
        }
    }

3.后序遍历:遍历顺序为:左子树->右子树->根.

代码如下:

    void postorder(tree* &t)
    {
        if(t!=NULL)
        {
            postorder(t->left);//先遍历左子树
            postorder(t->right);//然后遍历右子树
            cout<<t->data;//左右遍历都为空时,返回左右都为空的那棵树,然后输出该节点
        }
    }

最后是该题目的AC代码:

思路 : 模拟一遍前序遍历,然后赋相应的值,^ 则赋 NULL,不是 ^ 则赋该值给data域*,构建二叉树

    #include
    using namespace std;
    char c[1001];int tot;
    typedef struct node
    {
        char data;
        struct node* left;
        struct node* right;
    }tree;
    void create(tree* &t)//根据前序构建二叉树
    {
        char s=c[++tot];//考虑到多组数据输入,运用一个字符串数组c操作比较方便
        if(s=='^') t=NULL;//如果发现为‘^’则说明前一个指针指向的子树为空,赋值为NULL,相信大家学链表的时候都已经讲过了.
        else
        {
            t=(tree*)malloc(sizeof(node));//申请一个空白的存储空间,变为地址可写的一个指针
            t->data=s;//将前一个的指针t指向的子树数据赋值为s,然后继续遍历
            create(t->left);//继续模拟前序遍历,先访问左子树,然后访问右子树
            create(t->right);
        }
    
    }
    void preorder(tree* &t)//前序遍历
    {
        if(t!=NULL)
        {
            cout<<t->data;
            preorder(t->left);
            preorder(t->right);
        }
    }
    void inorder(tree* &t)//中序遍历
    {
        if(t!=NULL)
        {
            inorder(t->left);//左根右,遍历完之后从左边开始输出
            cout<<t->data;
            inorder(t->right);
        }
    }
    void postorder(tree* &t)//后序遍历
    {
        if(t!=NULL)
        {
            postorder(t->left);
            postorder(t->right);
            cout<<t->data;//左右遍历都为空时,返回左右都为空的那棵树,肯定先左后右;
        }
    }
    int main()
    {
        while(cin>>c){//多组数据输入字符串
            tot=-1;//赋初值
            tree* root;
            create(root);
            preorder(root);
            cout<<endl;//注意每次遍历完要输出换行符
            inorder(root);
            cout<<endl;
            postorder(root);
            cout<<endl;
        }
        return 0;
    }

其实这道题终归来讲,还是需要熟悉二叉树的各种遍历方式,其他的也都迎刃而解了.

你可能感兴趣的:(c++,二叉树,数据结构)