二叉树的建立和遍历

3、二叉树的建立

   如果要在内存中建立一个如下左图这样的树,wield能让每个结点确认是否有左右孩子,我们对它进行扩展,变成如下右图的样子,也就是将二叉树中的每个结点的空指针引出一个虚结点,其值为一个特定值,比如#,称之为扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。如前序遍历序列为AB#D##C##。

 

    有了这样的准备,就可以看看如何生成一棵二叉树了。假设二叉树的结点均为一个字符,把刚才前序遍历序列AB#D##C##用键盘挨个输入,实现的算法如下所示。

#include <cstdio>
#include <cstdlib>
//#define _OJ_
typedef struct tree
{
    char data;
    struct tree *lchild;
    struct tree *rchild;
} tree, *bitree;

/*bitree
init_tree(void)
{
    bitree T;
    T = (bitree) malloc (sizeof(tree));
    T->lchild = NULL;
    T->rchild = NULL;
}*/

bitree
creat_tree(bitree T)
{
    char ch;
    scanf("%c", &ch);
    if(ch == '#')
        T = NULL;
    else
    {
    T = (bitree) malloc (sizeof(tree));
    T->data = ch;
    T->lchild = creat_tree(T->lchild);
    T->rchild = creat_tree(T->rchild);
    }
    //同理可得中,后序创立二叉树只要把以上三个操作换一下顺序而已!!!
    return T;
}

void
trverse(bitree T)
{
    if(T)
    {
    printf("%c\n", T->data);
    trverse(T->lchild);
    trverse(T->rchild);
    }//同理可得中,后序遍历二叉树只要把以上三个操作换一下顺序而已!!!
}

int main(int argc, char const *argv[]) {
#ifndef _OJ_  //ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif


    bitree T;
    T = creat_tree(T);
    trverse(T);
    return 0;
}

posted @ 2015-11-08 15:50  别笑  阅读(858)  评论(0编辑  收藏  举报