树--->二叉树

二叉树的简单实现


算法介绍

使用前序遍历输入并创建
前序遍历
中序遍历
后序遍历
层序遍历


第一次代码实现——–2016年-11月-8号 ———–

主函数

#include <stdio.h> 
#include <malloc.h>
#include <stdlib.h>

typedef char ElemType;
typedef struct BiTNode{
    ElemType data; //数据域
    struct BiTNode *pLchild, *pRchild;//定义左子树, 右子树
} BiTNode, *BiTree;

void createBiTree(BiTree *T);//创建二叉树函数
void PreOrderTraverse(BiTree T); // 前序遍历
void InOrderTraverse(BiTree T) ; //中序遍历
void PostOrderTraverse(BiTree T); //后序遍历 

int main(){
    int level = 1;
    BiTree BT = NULL;// 初始化空指针
    createBiTree(&BT);
    printf("\n遍历二叉树-->前序遍历\n");
    PreOrderTraverse(BT);

    printf("\n遍历二叉树-->中序遍历\n");
    InOrderTraverse(BT);

    printf("\n遍历二叉树-->后序遍历\n");
    PostOrderTraverse(BT);


    return 0; 
}

创建二叉树

void createBiTree(BiTree *T){
    char c;
    scanf("%c", &c);
    if('#' == c){
        *T = NULL;
    }else{
        *T = (BiTree)malloc(sizeof(BiTNode));
        if(*T == NULL)
            exit(-1);
        (*T)->data = c;
        createBiTree( &(*T)->pLchild );
        createBiTree( &(*T)->pRchild);
    }
}

前序遍历

void PreOrderTraverse(BiTree T){
    if( T == NULL)
        return;
    printf("%c", T->data);
    PreOrderTraverse(T->pLchild);
    PreOrderTraverse(T->pRchild);
}

中序遍历

void InOrderTraverse(BiTree T){
    if( T== NULL)
        return ;
    InOrderTraverse(T->pLchild);
    printf("%c", T->data);
    InOrderTraverse(T->pRchild);
}

后序遍历

void PostOrderTraverse(BiTree T){
    if(T== NULL)
        return ;
    PostOrderTraverse(T->pLchild);
    PostOrderTraverse(T->pRchild);
    printf("%c", T->data);

}

层序遍历

//需要创建一个队列, 利用队列的特性,  
void LevelorderTraversal ( BiTree T ){
    Queue Q;
    BiTree BT;
    if( T == NULL){
        printf("空树, 遍历失败");
        return ; 
    }
    Q = createQueue();
    enQueue(Q, T);
    while( !IsEmpty(Q) ){
        BT = deleteQueue(Q);
        printf("%d", BT->data);
        if( BT->pLchild )
            enQueue(Q, BT->pLchild);
        if( BT->pRchild )
            enQueue(Q, BT->pRchild);
    }

} 

前序遍历(输出时加上 层级)

void PreOrderTraverse(BiTree T, int level){
    if( T == NULL )
        return ;
    printf("%c位于第 %d 层\n", T->data, level);
    PreOrderTraverse(T->pLchild, level+1);
    PreOrderTraverse(T->pRchild, level+1);
}

打印叶子节点

void PreOrderPrintLeaves(BiTree T){
    if( T != NULL){
        if(T->pLchild == NULL && T->pRchild == NULL)
            printf("%c\n", T->data);
        PreOrderPrintLeaves(T->pLchild);
        PreOrderPrintLeaves(T->pRchild);
    }
}

二叉树的深度

int PostOrderGetHeight( BiTree T){
    int HL, HR, MaxH;
    if( T != NULL){
        HL = PostOrderGetHeight(T->pLchild);
        HR = PostOrderGetHeight(T->pRchild);
        MaxH = (HL > HR) ? HL : HR;
        return (MaxH +1);
    }else{
        return 0;
    }
}

仅供参考 ,有错误望指出.

有大神路过请指点一下。 菜鸟求飞 !!!
有什么疑问 也可以在 下边 提问 ! (有点托大了)或者发邮件
E-Mail:[email protected]

猜你喜欢

转载自blog.csdn.net/qq_32603745/article/details/53088622