C语言二叉树.doc_第1页
C语言二叉树.doc_第2页
C语言二叉树.doc_第3页
C语言二叉树.doc_第4页
C语言二叉树.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #include #define STACK_MAX_SIZE 30#define QUEUE_MAX_SIZE 30#ifndef elemTypetypedef char elemType;#endif/*/* 以下是关于二叉树操作的11个简单算法 */*/ struct BTreeNodeelemType 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 *sSTACK_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(ai != 0)switch(ai)case :break; /* 对空格不作任何处理 */case (:if(top = STACK_MAX_SIZE - 1)printf(栈空间太小!n);exit(1);top+;stop = p;k = 1;break;case ):if(top = -1)printf(二叉树广义表字符串错误!n);exit(1);top-;break;case ,:k = 2;break;default:p =(struct BTreeNode *) malloc(sizeof(struct BTreeNode);p-data = ai;p-left = p-right = NULL;if(*bt = NULL)*bt = p;elseif( k = 1)stop-left = p;elsestop-right = p;i+; /* 为扫描下一个字符修改i值 */return;/* 3.检查二叉树是否为空,为空则返回1,否则返回0 */int emptyBTree(struct BTreeNode *bt)if(bt = NULL)return 1;elsereturn 0;/* 4.求二叉树深度 */int BTreeDepth(struct BTreeNode *bt)if(bt = NULL)return 0; /* 对于空树,返回0结束递归 */elseint dep1 = BTreeDepth(bt-left); /* 计算左子树的深度 */int dep2 = BTreeDepth(bt-right); /* 计算右子树的深度 */if(dep1 dep2)return dep1 + 1;elsereturn dep2 + 1;/* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */elemType *findBTree(struct BTreeNode *bt, elemType x)if(bt = NULL)return NULL;elseif(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;/* 7.清除二叉树,使之变为一棵空树 */void clearBTree(struct BTreeNode* *bt)if(*bt != NULL)clearBTree(&(*bt)-left);clearBTree(&(*bt)-right);free(*bt);*bt = NULL;return;/* 8.前序遍历 */void preOrder(struct BTreeNode *bt)if(bt != NULL)printf(%c , bt-data); /* 访问根结点 */preOrder(bt-left); /* 前序遍历左子树 */preOrder(bt-right); /* 前序遍历右子树 */return;/* 9.中序遍历 */void inOrder(struct BTreeNode *bt)if(bt != NULL)inOrder(bt-left); /* 中序遍历左子树 */printf(%c , bt-data); /* 访问根结点 */inOrder(bt-right); /* 中序遍历右子树 */return;/* 10.后序遍历 */void postOrder(struct BTreeNode *bt)if(bt != NULL)postOrder(bt-left); /* 后序遍历左子树 */postOrder(bt-right); /* 后序遍历右子树 */printf(%c , bt-data); /* 访问根结点 */return;/* 11.按层遍历 */void levelOrder(struct BTreeNode *bt)struct BTreeNode *p;struct BTreeNode *qQUEUE_MAX_SIZE;int front = 0, rear = 0;/* 将树根指针进队 */if(bt != NULL)rear = (rear + 1) % QUEUE_MAX_SIZE;qrear = bt;while(front != rear) /* 队列非空 */front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */p = qfront;printf(%c , p-data);/* 若结点存在左孩子,则左孩子结点指针进队 */if(p-left != NULL)rear = (rear + 1) % QUEUE_MAX_SIZE;qrear = p-left;/* 若结点存在右孩子,则右孩子结点指针进队 */if(p-right != NULL)rear = (rear + 1) % QUEUE_MAX_SIZE;qrear = p-right;return;/*/*int main(int argc, char *argv)struct BTreeNode *bt; /* 指向二叉树根结点的指针 */char *b; /* 用于存入二叉树广义表的字符串 */elemType x, *px;initBTree(&bt);printf(输入二叉树广义表的字符串:n);/* scanf(%s, b); */b = a(b(c), d(e(f, g), h(, i);createBTree(&bt, b);if(bt != NULL)printf( %c , bt-data);printf(以广义表的形式输出:n);printBTree(bt); /* 以广义表的形式输出二叉树 */printf(n);printf(前序:); /* 前序遍历 */preOrder(bt);printf(n);printf(中序:); /* 中序遍历 */inOrder(bt);printf(n);printf(后序:); /* 后序遍历 */postOrder(bt);printf(n);printf(按层:); /* 按层遍历 */levelOrder(bt);printf(n);/* 从二叉树中查找一个元素结点 */printf(输入一个待查找的字符:n);scanf( %c, &x); /* 格式串中的空格跳过空白字符 */px = findBTree(bt, x);if(px)printf(查找成功:%cn, *px);elseprintf(查找失败!n);printf(二叉树的深度为:);printf(%dn, BTreeDepth(bt);clearBTree(&bt);return 0;*/#include #define QUEUE_MAX_SIZE 20#define STACK_MAX_SIZE 10typedef int elemType;#include BT.c/*/* 以下是关于二叉搜索树操作的4个简单算法 */*/* 1.查找 */* 递归算法 */elemType *findBSTree1(struct BTreeNode *bst, elemType x)/* 树为空则返回NULL */if (bst = NULL)return NULL;elseif (x = bst-data)return &(bst-data);elseif (x data) /* 向左子树查找并直接返回 */return findBSTree1(bst-left, x);else /* 向右子树查找并直接返回 */return findBSTree1(bst-right, x);/* 非递归算法 */elemType *findBSTree2(struct BTreeNode *bst, elemType x)while (bst != NULL)if (x = bst-data)return &(bst-data);else if (x data)bst = bst-left;elsebst = bst-right;return NULL;/* 2.插入 */* 递归算法 */void insertBSTree1(struct BTreeNode* *bst, elemType x)/* 新建一个根结点 */if (*bst = NULL)struct BTreeNode *p = (struct BTreeNode *)malloc(sizeof(struct BTreeNode);p-data = x;p-left = p-right = NULL;*bst = p;return;else if (x data) /* 向左子树完成插入运算 */insertBSTree1(&(*bst)-left), x);else /* 向右子树完成插入运算 */insertBSTree1(&(*bst)-right), x);/* 非递归算法 */void insertBSTree2(struct BTreeNode* *bst, elemType x)struct BTreeNode *p;struct BTreeNode *t = *bst, *parent = NULL;/* 为待插入的元素查找插入位置 */while (t != NULL)parent = t;if (x data)t = t-left;elset = t-right;/* 建立值为x,左右指针域为空的新结点 */p = (struct BTreeNode *)malloc(sizeof(struct BTreeNode);p-data = x;p-left = p-right = NULL;/* 将新结点链接到指针为空的位置 */if (parent = NULL)*bst = p; /* 作为根结点插入 */else if (x data) /* 链接到左指针域 */parent-left = p;elseparent-right = p;return;/* 3.建立 */void createBSTree(struct BTreeNode* *bst, elemType a, int n)int i;*bst = NULL;for (i = 0; i n; i+)insertBSTree1(bst, ai);return;/* 4.删除值为x的结点,成功返回1,失败返回0 */int deleteBSTree(struct BTreeNode* *bst, elemType x)struct BTreeNode *temp = *bst;if (*bst = NULL)return 0;if (x data)return deleteBSTree(&(*bst)-left), x); /* 向左子树递归 */if (x (*bst)-data)return deleteBSTree(&(*bst)-right), x); /* 向右子树递归 */* 待删除的元素等于树根结点值且左子树为空,将右子树作为整个树并返回1 */if (*bst)-left = NULL)*bst = (*bst)-right;free(temp);return 1;/* 待删除的元素等于树根结点值且右子树为空,将左子树作为整个树并返回1 */if (*bst)-right = NULL)*bst = (*bst)-left;free(temp);return 1;else/* 中序前驱结点为空时,把左孩子结点值赋给树根结点,然后从左子树中删除根结点 */if (*bst)-left-right = NULL)(*bst)-data = (*bst)-left-data;return deleteBSTree(&(*bst)-left), (*bst)-data);else /* 定位到中序前驱结点,把该结点值赋给树根结点,然后从以中序前驱结点为根的树上删除根结点*/struct BTreeNode *p1 = *bst, *p2 = p1-left;while (p2-right != NULL)p1 = p2;p2 = p2-right;(*b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论