/*
二叉树ADT的实现(基于链式存储)
二叉树的特点:(设结点度为0,1,2的结点个数分别为:n0,n1,n2)
1,每个结点最多只有两个子树;
2,n0-1 = n2 ;
3,边的个数为 n0+n1+n2-1;
4, 结点总数为n的二叉树最少高度为 ,以2为底的log(n+1)上取整
结构体需求:
数据域,指针域(左右孩子指针)
功能实现:
二叉树的基本操作
*/
#include <stdio.h>
#include <stdlib.h>
#define End 0 //输入的数据域为该值时,表示空结点
typedef int TElemType;//数据域类型
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//方法体
//创,要注意的一点是,每次递归进入该方法的树的根节点已经被创建好,所以不需要再建
BiTree CreateBiTree(BiTree &T){
TElemType in;//新插入的结点数据
scanf("%d",&in);
if(in == End){ //输入的结点值为end,则为空结点
T = NULL;
}else{//输入的值非空,则创建新节点插入到父节点的对应位置
T = (BiTNode *)malloc(sizeof(BiTNode));
//使用前序遍历依次插入后序所有孩子结点
T->data = in;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return T;//返回当前树的根节点
}
//查
//各类遍历
void InOrderTraserval(BiTree T){//中序遍历该二叉树
if(T!=NULL){
InOrderTraserval(T->lchild);
printf("%d ",T->data);
InOrderTraserval(T->rchild);
}
}
void PreOrderTraserval(BiTree T){//前序遍历该二叉树
if(T!=NULL){
printf("%d ",T->data);
PreOrderTraserval(T->lchild);
PreOrderTraserval(T->rchild);
}
}
void LastOrderTraserval(BiTree T){//后序遍历该二叉树
if(T!=NULL){
LastOrderTraserval(T->lchild);
LastOrderTraserval(T->rchild);
printf("%d ",T->data);
}
}
//树的最大高度 (应使用递归,依次判断各节点左右子树的最大深度)
int HighBiTree(BiTree T){
if(T==NULL){//若该结点为叶子结点,则返回1个深度
return 0;
}else if(T->lchild!=NULL){
return HighBiTree(T->lchild)+1;
}else if(T->rchild!=NULL){
return HighBiTree(T->rchild)+1;
}else if(T->lchild==NULL&&T->rchild==NULL&&T!=NULL){
return 1;
}
}
int main(){
BiTree T;
CreateBiTree(T);
printf("\n该二叉树中序遍历为:\n");
InOrderTraserval(T);
printf("\n该二叉树前序遍历为:\n");
PreOrderTraserval(T);
printf("\n该二叉树后序遍历为:\n");
LastOrderTraserval(T);
printf("\n树高为%d!\n",HighBiTree(T));
}
二叉树遍历及计算高度(层序遍历在下一章)
最新推荐文章于 2023-04-16 09:00:00 发布