数据结构课程设计-二叉树

  • 格式:doc
  • 大小:1.90 MB
  • 文档页数:18

《数据结构》课程设计说明书二叉平衡树算法实现班级组别:二指导老师:完成时间:2019.6.19 组长:学号:05 组员1:学号:33 组员2:学号:组员3:学号:成绩:目录目录一、课题设计任务 (2)二、任务分析 (2)1. 数据逻辑结构(算法描述) (2)2. 关键算法思想 (3)三、概要设计(总体设计) (3)四、详细设计 (4)1. 数据存储结构 (4)2. 各模块流程图及算法 (5)3. 算法效率分析 (9)五、测试 (10)1. 删除 (10)2. 查找 (10)3. 遍历 (10)六、课程设计心得 (10)七、参考文献 (11)八、附录 (11)一、课题设计任务针对给定的序列建立存储结构,实现各种遍历;实现树的生成,实现数据的查找、插入、删除,输出各种遍历。

二、任务分析1.数据逻辑结构(算法描述)//中序--递归void InorderTra(PNode root) {if (root) {InorderTra(root->leftChild); //中序遍历左子树printf("%d\t", root->keyValue); //访问根节点InorderTra(root->rightChild); //中序遍历右子数}}//前序--递归void PreOrderTra(PNode root) {if (root != NULL) {printf("%d\t", root->keyValue); //访问根节点PreOrderTra(root->leftChild); //前序遍历左子树PreOrderTra(root->rightChild); //前序遍历右子数}}//后序--递归void PostOrderTra(PNode root) {if (root) {PostOrderTra(root->leftChild); //后序遍历左子树PostOrderTra(root->rightChild); //后序遍历右子树printf("%d\t", root->keyValue); //访问根节点}}//求树的最大深度int getDeep(PNode root) {if (!root) {return 0;}int leftDeep = getDeep(root->leftChild) + 1;int rightDeep = getDeep(root->rightChild) + 1;return leftDeep > rightDeep ? leftDeep : rightDeep;}//从根节点开始打印出所有层void printByLevel(PNode root, int deep) {for (int i = 0; i < deep; i++) {LevelOrderTra(root, i);}printf("\n");}2.关键算法思想树的生成过程保持左右平衡,插入删除过程中保证树的平衡。

三、概要设计(总体设计)包括功能模块的划分,各模块的调用关系图,程序总体流程图等。

四、详细设计1.数据存储结构树的结构体typedef struct Node {dataType keyValue; //数据int BalanceFactor; //平衡因子struct Node *leftChild, *rightChild;}*PNode2.各模块流程图及算法树的元素插入int InsertKeyValue(PNode* node, dataType keyValue,bool* higher) {if ((*node) == NULL) { //树中不包含此键值,则新建一个节点,(*node) = createNode(keyValue);*higher=true;}else if ((*node)->keyValue == keyValue) { //树中已经包含此键值,则不需要插入*higher = false;return 0;}else if (keyValue < (*node)->keyValue) { //插入到左子树中if (!InsertKeyValue(&(*node)->leftChild, keyValue, higher)) //如果左子树中存在该节点return 0;if (*higher) {switch ((*node)->BalanceFactor){case LH:leftBalance(node);*higher = false;break;case RH:(*node)->BalanceFactor = EH;*higher = false;break;case EH:(*node)->BalanceFactor = LH;*higher = true;break;}}}else {if (!InsertKeyValue(&(*node)->rightChild, keyValue,higher)) //如果右子树中存在该节点return 0;if (*higher) {switch ((*node)->BalanceFactor){case LH:(*node)->BalanceFactor = EH;*higher = false;break;case RH:rightBalance(node);*higher = false;break;case EH:(*node)->BalanceFactor = RH;*higher = true;break;}}}return 1;}树的元素查找int SearchTree(PNode root, dataType key) {if (root->keyValue == key) {return 1;}else if (key > root->keyValue && root->rightChild) { return SearchTree(root->rightChild, key);}else if(key < root->keyValue && root->leftChild) { return SearchTree(root->leftChild, key);}else {return 0;}}树的元素删除bool delNode(PNode &root, dataType key,bool &shorter) { if (root == NULL) {return false;}else if (key == root->keyValue) {PNode tmp = NULL;if (root->leftChild == NULL) {tmp = root;root = root->rightChild;delete tmp;shorter = true;}else if (root->rightChild == NULL) {tmp = root;root = root->leftChild;delete tmp;shorter = true;}else {tmp = root->leftChild;while (tmp->rightChild) {tmp = tmp->rightChild;}root->keyValue = tmp->keyValue;delNode(root->leftChild, tmp->keyValue, shorter);}}else if (key < root->keyValue) {if (!delNode(root->leftChild, key, shorter)) {return false;}if (shorter) {switch (root->BalanceFactor){case LH:root->BalanceFactor = EH;shorter = true;break;case RH:rightBalance(&root);if (root->rightChild->BalanceFactor == EH) {shorter = false;}else {shorter = true;}break;case EH:root->BalanceFactor = RH;shorter = false;break;}}}else {if (!delNode(root->rightChild, key, shorter)) {return false;}if (shorter) {switch (root->BalanceFactor){case LH:leftBalance(&root);if (root->leftChild->BalanceFactor == EH) {shorter = false;}else {shorter = true;}break;case EH:root->BalanceFactor = LH;shorter = false;break;case RH:root->BalanceFactor = EH;shorter = true;break;}}}return true;}3.算法效率分析树的元素插入算法的算法效率为:O(length)树的元素查找算法的算法效率为:O(length)树的元素删除算法的算法效率为:O(length)五、测试1.删除2.查找3.遍历六、课程设计心得为了制作这个课程设计去网上、书上查阅了大量资料,甚至问了很多其他专业的同学,发现我们专业的水平还是不行,制作的这个课设也有很多其他的毛病。

算法中有很多都是实验课上老师所讲过的,所以实验课还是十分的重要,锻炼了我们的动手能力,不会是纸上谈兵。

通过这次课设,让我们明白了合作的重要性,团结合作才能节省时间,并且,让我们深刻了解到了数据结构这门课的魅力,产生了要努力学习它的想法,也相信我们在下一次的课设中会越来越好。

七、参考文献[1]文志诚,王精明,徐云剑,郭艾寅.数据结构:C语言描述.长春:吉林大学出版社,2015.[2]严蔚敏,吴伟民.数据结构(C:语言版).北京:清华大学出版社,2011.八、附录// AVLTree.cpp: 定义控制台应用程序的入口点。