二叉树在C语言中的实现与应用详解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/************************************************************************/

二叉树在C语言中的实现与应用

/************************************************************************/

#include

#include

#define STACK_MAX_SIZE 30

#define QUEUE_MAX_SIZE 30

#ifndef elemType

typedef char elemType;

#endif

/************************************************************************/

/* 以下是关于二叉树操作的11个简单算法 */

/************************************************************************/ struct BTreeNode{

elemType data;

struct BTreeNode *left;

struct BTreeNode *right;

};

/* 1.初始化二叉树 */

void initBTree(struct BTreeNode* *bt)

{

*bt = NULL;

return;

}

/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */

void createBTree(struct BTreeNode* *bt, char *a)

{

struct BTreeNode *p;

struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */

int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */

int k; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */ int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */

*bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */

/* 每循环一次处理一个字符,直到扫描到字符串结束符\0为止 */

while(a[i] != '\0'){

switch(a[i]){

case ' ':

break; /* 对空格不作任何处理 */

case '(':

if(top == STACK_MAX_SIZE - 1){

printf("栈空间太小!\n");

exit(1);

}

top++;

s[top] = p;

k = 1;

break;

case ')':

if(top == -1){

printf("二叉树广义表字符串错误!\n");

exit(1);

}

top--;

break;

case ',':

k = 2;

break;

default:

p = new BTreeNode ;

p->data = a[i];

p->left = p->right = NULL;

if(*bt == NULL){

*bt = p;

}else{

if( k == 1){

s[top]->left = p;

}else{

s[top]->right = p;

}

}

}

i++; /* 为扫描下一个字符修改i值 */

}

return;

}

/* 3.检查二叉树是否为空,为空则返回1,否则返回0 */ int emptyBTree(struct BTreeNode *bt)

{

if(bt == NULL){

return 1;

}else{

return 0;

}

}

/* 4.求二叉树深度 */

int BTreeDepth(struct BTreeNode *bt)

{

if(bt == NULL){

return 0; /* 对于空树,返回0结束递归 */

}else{

int dep1 = BTreeDepth(bt->left); /* 计算左子树的深度 */

int dep2 = BTreeDepth(bt->right); /* 计算右子树的深度 */

if(dep1 > dep2){

return dep1 + 1;

}else{

return dep2 + 1;

}

}

}

/* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */ elemType *findBTree(struct BTreeNode *bt, elemType x)

{

if(bt == NULL){

return NULL;

}else{

if(bt->data == x){

return &(bt->data);

}else{ /* 分别向左右子树递归查找 */

elemType *p;

if(p = findBTree(bt->left, x)){

return p;

}

if(p = findBTree(bt->right, x)){

return p;

}

return NULL;

}

}

}

/* 6.输出二叉树(前序遍历) */

void printBTree(struct BTreeNode *bt)

{

/* 树为空时结束递归,否则执行如下操作 */

if(bt != NULL){

printf("%c", bt->data); /* 输出根结点的值 */

if(bt->left != NULL || bt->right != NULL){

printf("(");

printBTree(bt->left);

if(bt->right != NULL){

printf(",");

}

printBTree(bt->right);

printf(")");

}

}

return;

}

相关文档
最新文档