算法学习之二叉排序树的平衡化

首先提出问题:问什么要让二叉树排序树平衡化

比如给出{1,2,3,4,5,6,7}让我们将其构造成排序树,如下图

可以看出,此时二叉树变成了数组,而我们为了提高搜索效率的初衷也被打破了

为了解决这种极端情况,我们需要对二叉树进行平衡化

概念

  • 每个节点的左子树和右子树的高度差至多为一

  • 必须是二叉查找树

  • 高度是从根节点到目标节点的层数

思路

我们需要查询出从根节点开始其左右子节点的高度

  • 若左子树的高度-右子树高度>1,该节点右旋

  • 若右子树的高度-左子树高度>1,该节点左旋

  • 右旋的步骤

    • 让该节点的左节点更为新的根结点,即该节点的左子节点指向左子树的右子树,该节点的左子树的右子节点指向该节点,在用父节点指向新的节点

  • 左旋的步骤

    • 让该节点的右节点更为新的根结点,即该节点的右子节点指向右子树的左子树,该节点的右子树的左子节点,指向该节点,在用父节点指向新的节点

 进行右旋时,节点左子树的右子树高度大于左子树的左子树高度时,其左子树要先左旋,既保证左子树高度大于右子树高度

进行左旋时,节点右子树的左子树高度大于右子树的右子树高度时,其右子树要先右旋,既保证右子树高度大于左子树高度

代码

 
class BinaryNode {

    /**
     * 查找父节点
     * @param node
     * @return
     */
    public BinaryNode getFatherNode(BinaryNode node) {
        BinaryNode node1 = null;
        if (this.left != null) {
            if (this.left == node) {
                node1 = this;
                return node1;
            }else {
                node1 = this.left.getFatherNode(node);
            }
        }
        if (node1 != null) {
            return node1;
        }
        if (this.right != null) {
            if (this.right == node) {
                node1 = this;
                return node1;
            }else {
                node1 = this.right.getFatherNode(node);
            }
        }
        return node1;
    }

    /**
     * 查询节点的高度
     * @return 该节点的高度
     */
    public int highOfNode() {
       return Math.max(left == null ? 0 : left.highOfNode(),right == null ? 0 : right.highOfNode()) + 1 ;
    }

    /**
     * 左子树的高度
     * @return 如果左节点为空,返回0,反之返回高度
     */
    public int leftHigh() {
        if (this.left == null) {
            return 0;
        }else {
            return left.highOfNode();
        }
    }

    /**
     * 右子树的高度
     * @return 如果右节点为空,返回0,反之返回高度
     */
    public int rightHigh() {
        if (this.right == null) {
            return 0;
        }else {
            return right.highOfNode();
        }
    }
}
class BinarySortTree {

    /**
     * 左旋转,使根结点的右节点成为新的根结点,原来根结点的右节点指向新根节点的左节点
     * 这样可以使当前树的左子树高度加一,右子树高度减一
     */
    public void leftRotation(BinaryNode node){
        // 方案一
        // 1.创建一个新的节点,newNode值等于根节点的值
//        BinaryNode node = new BinaryNode(root.getValue());
//        // 2.把新节点的左子树设置为根节点的左子树
//        node.left = root.left;
//        // 3.把新节点的右子树设置为根结点的右子树的左子树
//        node.right = root.right.left;
//        // 4.把根结点的值换为右子节点的值
//        root.setValue(root.right.getValue());
//        // 5.把根节点的右子树设置为右子树的右子树
//        root.right = root.right.right;
//        // 6.把当前节点的左子树设置为新节点
//        root.left = node;
        // 方案2
        // 找到其父节点
        boolean flag = true;
        BinaryNode fatherNode = getFatherNode(node);
        if (fatherNode != null && fatherNode.left != null && fatherNode.left == node) {
            flag = false;
        }
        // 左旋,该节点的右子树指向右子树的左子树,该节点的右子树的左子树,指向该节点,在用父节点指向新的节点
        BinaryNode index = node;
        BinaryNode newNode = node.right;
        node.right = newNode.left;
        newNode.left = index;
        if (node == root) {
            root = newNode;
        }else if (flag) {
            fatherNode.right = newNode;
        }else {
            fatherNode.left = newNode;
        }
    }


    /**
     * 右旋转,使根结点的左节点成为新的根结点,原来根结点的左节点指向新根节点的右节点
     * 这样可以使当前树的左子树高度减一,右子树高度加一
     */
    public void rightRotation(BinaryNode node) {
        boolean flag = true;
        BinaryNode fatherNode = getFatherNode(node);
        if (fatherNode != null && fatherNode.left != null && fatherNode.left == node) {
            flag = false;
        }
        BinaryNode index = node;
        BinaryNode newNode = node.left;
        node.left = newNode.right;
        newNode.right = index;
        if (node == root) {
            root = newNode;
        }else if (flag) {
            fatherNode.right = newNode;
        }else {
            fatherNode.left = newNode;
        }
    }

    /**
     * 顺序二叉树平衡化,平衡化是指每个节点的左子树和右子树的高度差至多为一
     * @param node
     */
    public void avl(BinaryNode node) {
        // 当左子树高度 - 右子树高度 > 1时,右旋,使左子树高度减一,右子树高度加一
        if ((node.leftHigh() - node.rightHigh()) > 1) {
            // 当节点左子树的右子树高度大于左子树的左子树高度时,其左子树要先左旋,既保证左子树高度大于右子树高度
            if (node.left != null && node.left.rightHigh() > node.left.leftHigh()) {
                leftRotation(node.left);
                rightRotation(node);
            }else {
                rightRotation(node);
            }
        }
        // 当右子树高度 - 左子树高度 > 1时,左旋,使右子树高度减一,左子树高度加一
        if ((node.rightHigh() - node.leftHigh()) > 1) {
            // 当节点右子树的左子树高度大于右子树的右子树高度时,其右子树要先右旋,既保证右子树高度大于左子树高度
            if (node.right != null && node.right.leftHigh() > node.right.rightHigh()) {
                rightRotation(node.right);
                leftRotation(node);
            }else {
                leftRotation(node);
            }
        }
        if (node.left != null) {
            avl(node.left);
        }
        if (node.right != null) {
            avl(node.right);
        }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
12篇学通csharp网络编程——第四篇 TCP应用编程 12篇学通csharp网络编程——第三篇 HTTP应用编程(下) 12篇学通csharp网络编程——第二篇 HTTP应用编程(上) 12篇学通csharp网络编程——第一篇 基础之进程线程 Lucene(1)lucene,你也会(7篇)——第一篇 快速入门 MongoDB(8)8天学通MongoDB——第八天 驱动实践 8天学通MongoDB——第七天 运维技术 8天学通MongoDB——第六天 分片技术 8天学通MongoDB——第五天 主从复制 8天学通MongoDB——第四天 索引操作 8天学通MongoDB——第三天 细说高级操作 8天学通MongoDB——第二天 细说增删查改 8天学通MongoDB——第一天 基础入门 UML系列(4)团队沟通利器之UML——类图 团队沟通利器之UML—— 序列图 团队沟通利器之UML——用例图 团队沟通利器之UML——活动图 wcf系列(5)wcf系列学习5天速成——第五天 服务托管 wcf系列学习5天速成——第四天 wcf之分布式架构 wcf系列学习5天速成——第三天 事务的使用 wcf系列5天速成——第二天 binding的使用(2) wcf系列5天速成——第一天 binding的使用(1) wpf系列(8)8天入门wpf—— 第八天 最后的补充 8天入门wpf—— 第七天 画刷 8天入门wpf—— 第六天 细说控件 8天入门wpf—— 第五天 数据绑定 8天入门wpf—— 第四天 模板 8天入门wpf—— 第三天 样式 8天入门wpf—— 第二天 xaml详解 8天入门wpf—— 第一天 基础概念介绍 并行开发(8)8天玩转并行开发——第八天 用VS性能向导解剖你的程序 8天玩转并行开发——第七天 简要分析任务与线程池 8天玩转并行开发——第六天 异步编程模型 8天玩转并行开发——第五天 同步机制(下) 8天玩转并行开发——第四天 同步机制(上) 8天玩转并行开发——第三天 plinq的使用 8天玩转并行开发——第二天 Task的使用 8天玩转并行开发——第一天 Parallel的使用 多线程系列(5)5天不再惧怕多线程——第五天 线程池 5天不再惧怕多线程——第四天 信号量 5天不再惧怕多线程——第三天 互斥体 5天不再惧怕多线程——第二天 锁机制 5天不再惧怕多线程——第一天 尝试Thread 经典算法专题(21)经典算法题每日演练——第二十一题 十字链表 经典算法题每日演练——第二十题 三元组 经典算法题每日演练——第十九题 双端队列 经典算法题每日演练——第十八题 外排序 经典算法题每日演练——第十七题 Dijkstra算法 经典算法题每日演练——第十六题 Kruskal算法 经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼 经典算法题每日演练——第十二题 线段 经典算法题每日演练——第十一题 Bitmap算法 经典算法题每日演练——第十题 状数组 经典算法题每日演练——第九题 优先队列 经典算法题每日演练——第八题 AC自动机 经典算法题每日演练——第七题 KMP算法 经典算法题每日演练——第六题 协同推荐SlopeOne 算法 经典算法题每日演练——第五题 字符串相似度 经典算法题每日演练——第四题 最长公共子序列 经典算法题每日演练——第三题 猴子吃桃 经典算法题每日演练——第二题 五家共井 经典算法题每日演练——第一题 百钱买百鸡 开发利器系列(1)介绍一个小工具 Linqer 那点所谓的分布式(2)那点所谓的分布式——memcache 那点所谓的分布式——redis 结构专题(5)6天通吃结构—— 第五天 Trie 6天通吃结构—— 第四天 伸展 6天通吃结构—— 第三天 Treap 6天通吃结构—— 第二天 平衡 6天通吃结构—— 第一天 二查找 算法速成系列(15)算法系列15天速成——第十五天 图【下】(大结局) 算法系列15天速成——第十四天 图【上】 算法系列15天速成——第十三天 操作【下】 算法系列15天速成——第十二天 操作【中】 算法系列15天速成——第十一天 操作(上) 算法系列15天速成——第十天 栈 算法系列15天速成——第九天 队列 算法系列15天速成——第八天 线性表【下】 算法系列15天速成——第七天 线性表【上】 算法系列15天速成——第六天 五大经典查找【下】 算法系列15天速成——第五天 五大经典查找【中】 算法系列15天速成——第四天 五大经典查找【上】 算法系列15天速成——第三天 七大经典排序【下】 算法系列15天速成——第二天 七大经典排序【中】 算法系列15天速成——第一天 七大经典排序【上】 算法洗脑系列(8)算法洗脑系列(8篇)——第八篇 概率思想 算法洗脑系列(8篇)——第七篇 动态规划 算法洗脑系列(8篇)——第六篇 回溯思想 算法洗脑系列(8篇)——第五篇 分治思想 算法洗脑系列(8篇)——第四篇 枚举思想 算法洗脑系列(8篇)——第三篇 贪心思想 算法洗脑系列(8篇)——第二篇 递归思想 算法洗脑系列(8篇)——第一篇 递推思想 天籁数学(3)天籁数学——数列篇(3) 天籁数学——数列篇(2) 天籁数学——数列篇(1) 图形图像(1)玩玩图形图像——第一篇:图片灰度 小爬虫系列(4)玩玩小爬虫——抓取时的几个小细节 玩玩小爬虫——抓取动态页面 玩玩小爬虫——试搭小架构 玩玩小爬虫——入门
数据结构算法演示 1. 顺序表 (1)在顺序表中插入一个数据元素(ins_sqlist) (2)删除顺序表中一个数据元素(del_sqlist) (3)合并两个有序顺序表(merge_sqlist) 2. 链表 (1)创建一个单链表(Crt_LinkList) (2)在单链表中插入一个结点(Ins_LinkList) (3)删除单链表中的一个结点(Del_LinkList) (4)两个有序链表求并(Union) (5)归并两个有序链表(MergeList_L) (6)两个有序链表求交(ListIntersection_L) (7)两个有序链表求差(SubList_L) 3. 栈和队列 (1)计算阿克曼函数(AckMan) (2)栈的输出序列(Gen、Perform) (3)递归算法的演示  汉诺塔的算法(Hanoi)  解皇后问题的算法(Queen)  解迷宫的算法(Maze)  解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值(Exp_reduced) 4. 串的模式匹配 (1)古典算法(Index_BF) (2)求Next 函数值(Get_next)和按Next 函数值进行匹配 (Index_KMP(next)) (3)求 Next 修正值(Get_nextval)和按 Next 修正值进行匹配(Index_KMP(nextval)) 5. 稀疏矩阵 (1)矩阵转置 (Trans_Sparmat) (2)快速矩阵转置 (Fast_Transpos) (3)矩阵乘法 (Multiply_Sparmat) 6. 广义表 (1)求广义表的深度(Ls_Depth) (2)复制广义表(Ls_Copy) (3)创建广义表的存储结构(Crt_Lists) 7. 二 (1)遍历二  二的线索  先序遍历(Pre_order)  中序遍历(In_order)  后序遍历(Post_order) (2) 按先序建二(CrtBT_PreOdr) (3) 线索二  二的线索  生成先序线索(前驱或后继) (Pre_thre)  中序线索(前驱或后继) (In_thre)  后序线索(前驱或后继) (Post_thre)  遍历中序线索二(Inorder_thlinked)  中序线索的插入(ins_lchild_inthr)和删除(del_lchild_inthr)结点 (4)建赫夫曼和求赫夫曼编码(HuffmanCoding) (5)森林转成二(Forest2BT) (6)二成森林(BT2Forest) (7)按表达式建(ExpTree)并求值(CalExpTreeByPostOrderTrav) 8. 图 (1)图的遍历  深度优先搜索(Travel_DFS)  广度优先搜索(Travel_BFS) (2)求有向图的强连通分量(Strong_comp) (3)有向无环图的两个算法  拓扑排序(Toposort)  关键路径(Critical_path) (4)求最小生成  普里姆算法(Prim)  克鲁斯卡尔算法(Kruscal) (5)求关节点和重连通分量(Get_artical) (6)求最短路径  弗洛伊德算法(shortpath_Floyd)  迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_compaction) 10. 静态查找 (1)顺序查找(Search_Seq) (2)折半查找 (Serch_Bin) (3)插值查找 (Search_Ins) (4)斐波那契查找 (Search_Fib) (5)次优查找(BiTree_SOSTree) 11. 动态查找 (1)在二排序上进行查找(bstsrch)、插入结点(ins_bstree)和删除结点(del_bstree) (2)在二平衡上插入结点(ins_AVLtree) 和删除结点(del_AVLtree) (3)在 B-上插入结点(Ins_BTree) 和 删除结点(Del_BTree) (4)在 B+上插入结点(Ins_PBTree) 和 删除结点(Del_PBTree) 12. 内部排序 (1)简单排序法  直接插入排序(Insert_sort)  表插入排序(内含插入(Ins_Tsort) 重排(Arrange)两个算法)  起泡排序(BubbleSort)  简单选择排序(SelectSort) (2)复杂排序法  堆排序(HeapSort)  快速排序(QuickSort)  锦标赛排序(Tournament) (3)其他  快速地址排序(QkAddrst)  基数排序(RadixSort) 13. 外部排序 (1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection)
因为小弟权限不够,所以分开两个帖子上存,资源名称分别是: Java数据结构和算法中文第二版(1) Java数据结构和算法中文第二版(2) 【内容简介】 本书可帮助读者: 通过由基于JAVA的演示所组成的可视专题讨论来掌握数据结构和算法 学会如何为常见和不太常见的编程条件选择正确的算法 利用数据结构和算法为现实世界的处理过程建模 了解不同的数据结构的优势和弱点,考虑如何利用它们改进编程的效率 学会如何用面向对象的编程简数据结构和算法 本书以一种易懂的方式教授如何安排和操纵数据的问题,其中不乏一些难题;了解这些知识以期使计算机的应用获得最好的表现。 不管使用何种语言或平台,掌握了数据结构和算法将改进程序的质量和性能。 书中提供了一套独创的可视讨论专题用以阐明主要的论题;它使用JAVA语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二版中,他利用Java语言最新特性,修改并扩充了他的例子。在每一章后都有问题和练习,使读者有机会测试自己的理解程序。 【原 书 名】 Data Structures & Algorithms in Java 【原出版社】 SAMS 【作  者】[美]Robert Lafore [同作者作品] [作译者介绍] 【译  者】 计晓云[同译者作品] 赵研 曾希 狄小菡 【丛 书 名】 国外经典计算机科学教材 【出 版 社】 中国电力出版社  【书 号】 7508319117 【出版日期】 2004年2月 【开 本】 16开 【页 码】 560 【版 次】2-1 本书以一种易懂的方式教授如何安排和操纵数据的问题,其中不乏一些难题;了解这些知识以期使计算机的应用获得最好的表现。不管使用何种语言或平台,掌握了数据结构和算法将改进程序的质量和性能。 书中提供了一套独创的可视讨论专题用以阐明主要的论题;它使用Java语言说明重要的概念,而避免C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二版中,他利用Java语言最新特性,修改并扩充了他的例子。在每一章后都有问题和练习,使读者有机会测试自己的理解程序。 出版说明 献词 简介 第1章 综述 数据结构和算法能起到什么作用? 数据结构的概述 算法的概述 一些定义 面向对象编程 软件工程 对于C++程序员的Java Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验 编程作业 第3章 简单排序 如何排序? 冒泡排序 选择排序 插入排序 对象排序 几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验 编程作业 第6章 递归 三角数字 阶乘 变位字 递归的二分查找 汉诺(Hanoi)塔问题 归并排序 清除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二 为什么使用二的术语 一个类比 二搜索如何工作 查找节点 插入一个节点 遍历 查找最大值和最小值 删除节点 二的效率 用数组表示 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红-黑 本章讨论的方法 平衡和非平衡 使用RBTree专题applet 用专题applet做试验 旋转 插入一个新节点 删除 红-黑的效率 红-黑的实现 其他平衡 小结 问题 实验 第10章 2-3-4和外部存储 2-3-4的介绍 Tree234专题applet 2-3-4的Java代码 2-3-4和红-黑 2-3-4的效率 2-3 外部存储 小结 问题 实验 编程作业 第11章 哈希表 哈希简介 开放地址法 链地址法 哈希函数 哈希的效率 哈希和外部存储 小结 问题 实验 编程作业 第12章 堆 堆的介绍 Heap专题applet 堆的Java代码 基于的堆 堆排序 小结 问题 实验 编程作业 第13章 图 图简介 搜索 最小生成 有向图的拓扑排序 有向图的连通性 小结 问题 实验 编程作业 第14章 带权图 带权图的最小生成 最短路径问题 每一对顶点之间的最短路径问题 效率 难题 小结 问题 实验 编程作业 第15章 应用场合 通过数据结构 专用数据结构 排序 图 外部存储 前进 附录A 运行专题applet和示例程序 专题applet 示例程序 Sun Microsystem软件开发工具集 重名的类文件 其他开发系统 附录B 进一步学习 数据结构和算法 面向对象程序语言 面向对象设计(OOD)和软件工程 附录C 问题答案 第1章,综述 第2章,数组 第3章,简单排序 第4章,栈与队列 第5章,链表 第6章,递归 第7章,高级排序 第8章,二 第9章,红-黑 第10章,2-3-4和外部存储 第11章,哈希表 第12章,堆 第13章,图 第14章,带权图
1本程序在vc++6.0编译通过并能正常运行。 2主界面 程序已经尽量做到操作简便了,用户只需要根据提示一步步进行操作就行了。 六思考和总结: 这个课程设计的各个基本操作大部分都在我的综合性实验中实现了,所以做这个主要攻克插入和删除这两个算法!其中插入在书本上已经有了,其中的右平衡算法虽然没有给出,但通过给出的左平衡算法很容易就可以写出右平衡算法。所以最终的点就在于删除算法的实现!做的过程中对插入算法进行了非常非常多次的尝试!花了非常多的时间,这其中很多时候是在对程序进行单步调试,运用了VC6。0的众多良好工具,也学到了很多它的许多好的调试手段。 其中删除算法中最难想到的一点是:在用叶子结点代替要删除的非叶子结点后,应该递归的运用删除算法去删除叶子结点!这就是整个算法的核心,其中很强烈得体会到的递归的强大,递归的最高境界(我暂时能看到的境界)! 其它的都没什么了。选做的那两个算法很容易实现的: 1合并两棵平衡排序:只需遍历其中的一棵,将它的每一个元素插入到另一棵即可。 2拆分两棵平衡排序:只需以根结点为中心,左子独立为一棵,右子独立为一棵,最后将根插入到左子或右子即可。 BSTreeEmpty(BSTree T) 初始条件:平衡排序存在。 操作结果:若T为空平衡排序,则返回TRUE,否则FALSE. BSTreeDepth(BSTree T) 初始条件:平衡排序存在。 操作结果:返回T的深度。 LeafNum(BSTree T) 求叶子结点数,非递归中序遍历 NodeNum(BSTree T) 求结点数,非递归中序遍历 DestoryBSTree(BSTree *T) 后序遍历销毁平衡排序T R_Rotate(BSTree *p) 对以*p为根的平衡排序作右旋处理,处理之后p指向新的根结点 即旋转处理之前的左子的根结点 L_Rotate(BSTree *p) 对以*p为根的平衡排序作左旋处理,处理之后p指向新的根结点, 即旋转处理之前的右子的根结点 LeftBalance(BSTree *T) 对以指针T所指结点为根的平衡排序作左平衡旋转处理, 本算法结束时,指针T指向新的根结点 RightBalance(BSTree *T) 对以指针T所指结点为根的平衡排序作右平衡旋转处理, 本算法结束时,指针T指向新的根结点 Insert_AVL(BSTree *T, TElemType e, int *taller) 若在平衡的二排序T中不存在和e有相同的关键字的结点, 则插入一个数据元素为e的新结点,并返回OK,否则返回ERROR. 若因插入而使二排序失去平衡,则作平衡旋转处理 布尔变量taller反映T长高与否 InOrderTraverse(BSTree T) 递归中序遍历输出平衡排序 SearchBST(BSTree T, TElemType e, BSTree *f, BSTree *p) 在根指针T所指的平衡排序中递归的查找其元素值等于e的数据元素, 若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p 指向查找路径上访问的最后一个结点并返回FALSE,指针f指向T的双亲, 其初始调用值为NULL Delete_AVL(BSTree *T, TElemType e, int *shorter) 在平衡排序中删除元素值为e的结点,成功返回OK,失败返回ERROR PrintBSTree_GList(BSTree T) 以广义表形式打印出来 PrintBSTree_AoList(BSTree T, int length) 以凹入表形式打印,length初始值为0 Combine_Two_AVL(BSTree *T1, BSTree T2) 合并两棵平衡排序 Split_AVL(BSTree T, BSTree *T1, BSTree *T2) 拆分两棵平衡 } (2)存储结构的定义: typedef struct BSTNode { TElemType data; int bf; //结点的平衡因子 struct BSTNode *lchild, *rchild;//左.右孩子指针 }BSTNode, *BSTree;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值