赞
踩
typedef char CElemType;
typedef struct BiTNode /* 结点结构 */
{
CElemType data; /* 结点数据 */
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
//具体你想干啥,这儿只做了打印的操作
Status visit(CElemType e)
{
printf("%c ",e);
return OK;
}
/* 构造空二叉树T */
Status InitBiTree(BiTree *T)
{
*T=NULL;
return OK;
}
// 创建一棵二叉树 约定用户遵照前序遍历的方式输入数据 void CreateBiTree(BiTree *T){ char c; scanf("%c", &c); if('#' == c){ *T = NULL; }else{ *T = (BiTNode *)malloc(sizeof(BiTNode));//malloc 返回的是地址 必须转一下让返回BiBNode类型的地址 if (!*T) { exit(OVERFLOW); } (*T)->data = c; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } }
/* 销毁二叉树 初始条件: 二叉树T存在。 操作结果: 销毁二叉树T */ void DestroyBiTree(BiTree *T) { if(*T) { /* 有左孩子 */ if((*T)->lchild) DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */ /* 有右孩子 */ if((*T)->rchild) DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */ free(*T); /* 释放根结点 */ *T=NULL; /* 空指针赋0 */ } }
/* 二叉树T的深度 初始条件: 二叉树T存在 操作结果: 返回T的深度 */ int BiTreeDepth(BiTree T){ int i,j; if(!T) return 0; //计算左孩子的深度 if(T->lchild) i=BiTreeDepth(T->lchild); else i=0; //计算右孩子的深度 if(T->rchild) j=BiTreeDepth(T->rchild); else j=0; //比较i和j return i>j?i+1:j+1; }
/*
前序递归遍历T
初始条件:二叉树T存在;
操作结果: 前序递归遍历T
*/
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
visit(T->data);/* 显示结点数据,可以更改为其它对结点操作 */
PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}
/*
中序递归遍历T
初始条件:二叉树T存在;
操作结果: 中序递归遍历T
*/
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
InOrderTraverse(T->lchild); /* 中序遍历左子树 */
visit(T->data);/* 显示结点数据,可以更改为其它对结点操作 */
InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}
/*
后序递归遍历T
初始条件:二叉树T存在;
操作结果: 中序递归遍历T
*/
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
visit(T->data);/* 显示结点数据,可以更改为其它对结点操作 */
}
#define MAXSIZE 100 /* 存储空间初始分配量 */
#define MAX_TREE_SIZE 100 /* 二叉树的最大结点数 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int CElemType; /* 树结点的数据类型,目前暂定为整型 */
typedef CElemType SqBiTree[MAX_TREE_SIZE]; /* 0号单元存储根结点 */
CElemType Nil = 0; /*设整型以0为空 或者以 INT_MAX(65535)*/
typedef struct {
int level; //结点层
int order; //本层的序号(按照满二叉树给定序号规则)
}Position;
Status visit(CElemType c){
printf("%d ",c);
return OK;
}
// 构造空二叉树T,因为T是固定数组,不会改变.
Status InitBiTree(SqBiTree T){
for (int i = 0; i < MAX_TREE_SIZE; i++) {
//将二叉树初始化值置空
T[i] = Nil;
}
return OK;
}
// 按层序次序输入二叉树中的结点值(字符型或整型),构造顺序存储的二叉树T Status CreateBiTree(SqBiTree T){ int i = 0; //printf("按层序输入结点的值(整型),0表示空结点, 输入999结束.结点数<=%d\n",MAX_TREE_SIZE); /* 1 -->1 2 3 -->2 4 5 6 7 -->3 8 9 10 -->4 1 2 3 4 5 6 7 8 9 10 Nil Nil Nil */ while (i < 10) { T[i] = i+1; printf("%d ",T[i]); //结点不为空,且无双亲结点 if (i != 0 && T[(i+1)/2-1] == Nil && T[i] != Nil) { printf("出现无双亲的非根结点%d\n",T[i]); exit(ERROR); } i++; } //将空赋值给T的后面的结点 while (i < MAX_TREE_SIZE) { T[i] = Nil; i++; } return OK; }
/* 获取二叉树的深度 初始条件: 二叉树已存在 操作结果: 返回二叉树T深度; */ int BiTreeDepth(SqBiTree T){ int j = -1; int i; //找到最后一个结点 //MAX_TREE_SIZE -> 100 -> 10 目的找到最后一个结点10的位置 for (i = MAX_TREE_SIZE-1 ; i>=0; i--) { if (T[i] != Nil) break; } do { j++; } while ( powl(2, j) <= i); //计算2的次幂 return j; }
/*返回处于位置e(层,本层序号)的结点值 初始条件: 二叉树T存在,e是T中某个结点(的位置) 操作结构: 返回处于位置e(层,本层序号)的结点值 */ CElemType Value(SqBiTree T,Position e){ /* Position.level -> 结点层.表示第几层; Position.order -> 本层的序号(按照满二叉树给定序号规则) */ //pow(2,e.level-1) 找到层序 printf("%d\n",(int)pow(2,e.level-1)); //e.order printf("%d\n",e.order); //4+2-2; return T[(int)pow(2, e.level-1)+e.order-2]; }
/* 给处于位置e的结点赋值 初始条件: 二叉树存在,e是T中某个结点的位置 操作结果: 给处于位置e的结点赋值Value; */ Status Assign(SqBiTree T,Position e,CElemType value){ //找到当前e在数组中的具体位置索引 int i = (int)powl(2, e.level-1)+e.order -2; //叶子结点的双亲为空 if (value != Nil && T[(i+1)/2-1] == Nil) { return ERROR; } //给双亲赋空值但是有叶子结点 if (value == Nil && (T[i*2+1] != Nil || T[i*2+2] != Nil)) { return ERROR; } T[i] = value; return OK; }
void LevelOrderTraverse(SqBiTree T){
int i = MAX_TREE_SIZE-1;
//找到最后一个非空结点的序号
while (T[i] == Nil) i--;
//从根结点起,按层序遍历二叉树
for (int j = 0; j <= i; j++)
//只遍历非空结点
if (T[j] != Nil)
visit(T[j]);
printf("\n");
}
void PreTraverse(SqBiTree T,int e){ //打印结点数据 visit(T[e]); //先序遍历左子树 if (T[2 * e + 1] != Nil) { PreTraverse(T, 2*e+1); } //最后先序遍历右子树 if (T[2 * e + 2] != Nil) { PreTraverse(T, 2*e+2); } } Status PreOrderTraverse(SqBiTree T){ //树不为空 if (!BiTreeEmpty(T)) { PreTraverse(T, 0); } printf("\n"); return OK; }
void InTraverse(SqBiTree T, int e){ /* 左子树不空 */ if (T[2*e+1] != Nil) InTraverse(T, 2*e+1); visit(T[e]); /* 右子树不空 */ if (T[2*e+2] != Nil) InTraverse(T, 2*e+2); } Status InOrderTraverse(SqBiTree T){ /* 树不空 */ if (!BiTreeEmpty(T)) { InTraverse(T, 0); } printf("\n"); return OK; }
void PostTraverse(SqBiTree T,int e) { /* 左子树不空 */ if(T[2*e+1]!=Nil) PostTraverse(T,2*e+1); /* 右子树不空 */ if(T[2*e+2]!=Nil) PostTraverse(T,2*e+2); visit(T[e]); } Status PostOrderTraverse(SqBiTree T) { if(!BiTreeEmpty(T)) /* 树不空 */ PostTraverse(T,0); printf("\n"); return OK; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。