二叉平衡排序树.pdfVIP

  • 9
  • 0
  • 约1.96万字
  • 约 19页
  • 2021-11-12 发布于江苏
  • 举报
《数据结构》 课程设计报告 专 业: 班 级: 姓 名: 指导教师: 学 号: 2010 年 7 月 5 日 二叉平衡排序树 一、课程设计内容 问题描述: 从一棵空树开始创建,在创建过程中, 保证树的有序性,同时还要针对树的 平衡性做些调整。最终要把创建好的二叉排序树转换为二叉平衡排序树。 基本要求: 1. 创建(插入、调整、改组) 2. 输出 二、主要算法说明 1、 . 主要数据结构定义 typedef struct node node; struct node { node* parent; node* left; node* right; int balance; // 左右子树高度之差 int key; }; 2、主要函数说明 int searchNode(int key, node* root, node** parent) :按 key 查找结点 node* minNode(node* root) :树 root 的最小结点 node* maxNode(node* root) :树 root 的最大结点 node* preNode(node* target) :求前驱结点 node* nextNode(node* target) :求后继结点 node* adjustAVL(node* root, node* parent, node* child) :调整,保证二叉树的平衡 性 node* insertNode(int key, node* root) :插入 node* deleteNode(int key, node* root) : 删除 node* createAVL(int *data, int size) :建造新的二叉树 void interordertraverse(node* root) :中序遍历 void preordertraverse(node* root) :先序遍历 3、二叉排序树的插入和删除 a. 二叉排序树的插入 在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。 插入过程:若二叉排序树已存在,则返回根节点; 当节点不存在时,将待插结点关键字 key 和树根关键字 parent-key 进行比较, 若 keyparent-key ,则插入到根的左子树中, 否则, 则插入到根的右子树中。 而子树中的插入过程和在树中的插入过程相同, 如此进行下 去,直到把结点作为一个新的树叶插入到二叉排序树中, 或者直到发现树已有相同关键字的 结点为止。并且注意二叉树的平衡性,时刻调整。 b. 二叉排序树的删除 假设在二叉排序树上被删结点为 *tp ,其双亲结点为 *parent ,且不失一般性, 可设 * *parent 是* parent-left; 的左孩子。 下面分 3 种情况进行讨论: (1)若 *parent 结点为叶子结点,即 PL 和 PR均为空树。由于删去叶子结点不破坏整棵树 的结构,则只需要修改其双亲结点的指针即可。 (2 )若*parent 结点只有左子树 PL或者只有右子树 PR,此时只要令 PL 或 PR直接成为其双 亲结点 *f 的左子树即可。显然,作此修改也不破坏二叉排序树的特性。 (3 )若 *parent 结点的左子树和右子树均不空。 并且注意二叉树的平衡性,时刻调整。 4、中序遍历和先序遍历 void interorde

文档评论(0)

1亿VIP精品文档

相关文档