数据结构_平衡二叉树
// 节点类 class Node { constructor(data) { this.data = data this.left = null this.right = null } } //平衡二叉树Balanced Binary Tree class BBT { constructor() { this.root = null } insert(data) { // 新建节点 let newNode = new Node(data) // 插入节点: this.root 是会进行改变 this.root = this.insertNode(this.root, newNode) } insertNode(node, newNode) { // 当前为空树 if (node == null) { node = newNode return node } else if (newNode.data < node.data) { // 向左边走 if (node.left == null) { node.left = newNode return node } else { node.left = this.insertNode(node.left, newNode) // 判断平衡 node = this.checkIsBalance(node) } } else if (newNode.data > node.data) { // 向右边走 if (node.right == null) { node.right = newNode return node } else { node.right = this.insertNode(node.right, newNode) // 判断平衡 node = this.checkIsBalance(node) } } return node } checkIsBalance(node) { // 根据左右子树的高度 // 1. 左子树-右子树 > 1 if ((this.getHeight(node.left) - this.getHeight(node.right)) > 1) { if (this.getHeight(node.left.left) > this.getHeight(node.left.right)) node = this.rotateR(node)// 右旋 else node = this.rotateLR(node)// 先左旋再右旋 } // 2. 右子树-左子树 > 1 else if ((this.getHeight(node.right) - this.getHeight(node.left)) > 1) { if (this.getHeight(node.right.right) > this.getHeight(node.right.left)) node = this.rotateL(node)// 左旋 else node = this.rotateRL(node)// 先右旋再左旋 } return node } // 孩子中最大高度+1 getHeight(node) { if (node == null) return 0 // 返回当前节点子树中的较大值+1 // Math.max() return (Math.max(this.getHeight(node.left), this.getHeight(node.right))) + 1 } // 右旋 rotateR(node){ let temp = node.left node.left = temp.right temp.right = node return temp } // 左旋 rotateL(node){ let temp = node.right node.right = temp.left temp.left = node return temp } // 左右旋 rotateLR(node){ node.left = this.rotateL(node.left) return this.rotateR(node) } // 右左旋 rotateRL(node){ node.right = this.rotateR(node.right) return this.rotateL(node) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!