----------------------------学习数据结构第三天-------------------------------
前言:今天学习一下二叉树,以前没学的时候就感觉这个数据结构是个神奇的结构,一生二,二生四。。。对这个数据结构总是抱有莫大的好奇,今天终于学到了,感觉这个数据结构是非常奇妙的。
今天学习的内容是:1.二叉树的定义与创建 2.前序遍历 3.中序遍历 4.后序遍历 4.节点多少 5.树的深度 6.销毁二叉树
总结:
1.二叉树的创建要用二级指针,我对这个为啥要用二级指针的原因也是一知半解,先暂时记住,以后用多了,就会慢慢理解吧。
2.前中后序遍历,这个前中后指的是双亲的位置,并且左右儿子的顺序总是左儿子在前,右儿子在后。例如前序遍历的顺序就是:双亲 左儿子 右儿子,其它两个也是如此。
3.销毁时,要判断节点的地址是否为空,然后free的也是节点的地址。
4.改变二叉树构造的话就要用二级指针,如果仅仅是查找值之类的一级指针即可。
#include <stdio.h>
#include <stdlib.h>
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *LChild,*RChild;
}BiTNode,*BiTree;
int max(int a,int b)
{
return a>b?a:b;
}
//创建二叉树是按前序遍历创建的
void CreateTree(BiTree *T)
{
TElemType data;
scanf("%d",&data);
if(data==0)//当数据等于0时,表示不创建这个节点
{
*T=NULL;
return ;
}
*T= (BiTNode *)malloc(sizeof(BiTNode));
if(!T)printf("创建失败!\n");
(*T)->data = data;//给节点赋值
//递归创建左右子树分支
CreateTree(&((*T)->LChild));
CreateTree(&((*T)->RChild));
}
//前序遍历
void PrePrint(BiTree T)
{
if(T==NULL)
return ;
printf("%d ",T->data);//输出自身
//递归输出子树
PrePrint(T->LChild);
PrePrint(T->RChild);
}
//中序遍历
void MidPrint(BiTree T)
{
if(T==NULL)
return ;
MidPrint(T->LChild);
printf("%d ",T->data);
MidPrint(T->RChild);
}
//后序遍历
void BackPrint(BiTree T)
{
if(T==NULL)
return ;
BackPrint(T->LChild);
BackPrint(T->RChild);
printf("%d ",T->data);
}
//返回二叉树的深度
int BiTree_depth(BiTree T)
{
int hl=0,hr=0;
if(T==NULL)
return 0;
else
{
hl=BiTree_depth(T->LChild);
hr=BiTree_depth(T->RChild);
return max(hl,hr)+1;
}
}
//返回二叉树的节点数
int Node_count(BiTree T)
{
if(T==NULL)
return 0;
else
return Node_count(T->LChild)+Node_count(T->RChild)+1;
}
//T是节点的地址的地址,*T才是节点的地址
void destroy(BiTree *T)
{
if(*T!=NULL)//这里是*T,*T才是分配的空间的地址
{
destroy(&((*T)->LChild));
destroy(&((*T)->RChild));
free(*T);
}
}
int main()
{
BiTree *T;
T=(BiTree *)malloc(sizeof(BiTree));
CreateTree(T);
printf("前序遍历:");
PrePrint(*T);
printf("\n中序遍历:");
MidPrint(*T);
printf("\n后序遍历:");
BackPrint(*T);
printf("\n节点数:%d",Node_count(*T));
printf("\n深度:%d",BiTree_depth(*T));
destroy(T);
return 0;
}