二叉树的简单实现
算法介绍
使用前序遍历输入并创建
前序遍历
中序遍历
后序遍历
层序遍历
第一次代码实现——–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]