当前位置: 首页 > news >正文

平衡二叉树最全代码

#include<stdio.h>
#include<stdlib.h>typedef struct Node
{int val;int height;struct Node *left;struct Node *right;
}Node;//创建新结点
Node* newNode(int val)
{Node *node = (Node*)malloc(sizeof(Node));node->val = val;node->height = 1;node->left = node->right = NULL;return node;
}//获取结点高度
int getHeight(Node *node)
{return node ? node->height : 0;
}int max(int a,int b)
{return a>b?a:b;
}//左旋操作
Node* leftRotate(Node* root)
{Node *newRoot = root->right;Node *T2 = newRoot->left;newRoot->left = root;root->right = T2;root->height = max(getHeight(root->left),getHeight(root->right)) + 1;newRoot->height = max(getHeight(newRoot->left),getHeight(newRoot->right)) + 1;return newRoot;
}//右旋操作
Node* rightRotate(Node* root)
{Node *newRoot = root->left;Node *T2 = newRoot->right;newRoot->right = root;root->height = max(getHeight(root->left),getHeight(root->right)) + 1;root->height = max(getHeight(newRoot->left),getHeight(newRoot->right)) + 1;return newRoot;
}//获取平衡因子(BF)
int getBalance(Node *node)
{return getHeight(node->left) - getHeight(node->right);
}//插入结点
Node* insert(Node* node,int key)
{if(!node)return newNode(key);if(key < node->val)node->left = insert(node->left,key);else if(key > node->val)node->right = insert(node->right,key);else return node;node->height = 1 + max(getHeight(node->left),getHeight(node->right));int balance = getBalance(node);// 左左情况if(balance > 1 && getBalance(node->left) > 0)return rightRotate(node);//右右情况if(balance < -1 && getBalance(node->right) < 0)return leftRotate(node);//左右情况	if(balance > 1 && getBalance(node->left) < 0){node->left = leftRotate(node->left);return rightRotate(node);}//右左情况if(balance < -1 && getBalance(node->right) > 0)  {node->right =  rightRotate(node->right);return  leftRotate(node);}return node;
}//删除结点
Node* deleteNode(Node* root,int key)
{if(!root)return root;if(key<root->val)root->left = deleteNode(root->left,key);else if(key>root->val)root->right = deleteNode(root->right,key);else{if(root->left == NULL || root->right == NULL){Node *temp = root->left ? root->left : root->right;if(temp == NULL){temp = root;root = NULL;}else{*root =  *temp;}free(temp);}else{Node *temp = root->right;while(temp && temp->left != NULL)temp = temp->left;root->val = temp->val;root->right = deleteNode(root->right,temp->val);}}if(root == NULL)return root;root->height = 1 + max(getHeight(root->left),getHeight(root->right));int balance =getBalance(root);if(balance > 1 && getBalance(root->left) >= 0)return rightRotate(root);if(balance > 1 && getBalance(root->left) < 0){root->left = leftRotate(root->left);return rightRotate(root);}if(balance < -1 && getBalance(root->right) <= 0)return leftRotate(root);if(balance < -1 && getBalance(root->right) > 0){root->right = rightRotate(root->right);return leftRotate(root);}return root;
}
// 修改节点值
Node* modifyNode(Node* root, int oldVal, int newVal) {// 先删除节点root = deleteNode(root, oldVal);// 然后插入新的值root = insert(root, newVal);return root;  // 返回修改后的树的根
}
void preOrder(Node *root)
{if(root){printf("%d ",root->val);preOrder(root->left);preOrder(root->right);}
}void inOrder(Node *root)
{if(root){inOrder(root->left);printf("%d ",root->val);inOrder(root->right);}
}Node *find(Node *root,int key)
{if(root == NULL || root->val)return root;if(key < root->val)return find(root->left,key);elsereturn find(root->right,key);
}void test()
{// 插入节点Node *root = NULL;root = insert(root, 10);root = insert(root, 20);root = insert(root, 30);root = insert(root, 40);root = insert(root, 50);root = insert(root, 60);root = insert(root, 70);root = insert(root, 80);printf("-----先序遍历-----\n");preOrder(root);printf("\n");printf("-----中序遍历-----\n");inOrder(root);printf("\n");// 修改节点printf("修改节点 30 为 35:\n");root = modifyNode(root, 30, 35);printf("-----先序遍历-----\n");preOrder(root);printf("\n");printf("删除节点35:\n");root = deleteNode(root, 35);preOrder(root);printf("\n");}int main()
{test();return 0;
}

相关文章:

平衡二叉树最全代码

#include<stdio.h> #include<stdlib.h>typedef struct Node {int val;int height;struct Node *left;struct Node *right; }Node;//创建新结点 Node* newNode(int val) {Node *node (Node*)malloc(sizeof(Node));node->val val;node->height 1;node->l…...

数据库表的创建

运用的环境是pychram python3.11.4 创建一个表需要用到以下语法 注释已经写清楚各种语法的含义&#xff0c;记住缩进是你程序运行的关键&#xff0c;因为程序是看你的缩进来判断你的运行逻辑&#xff0c;像我这个就是缩进不合理导致的报错 那么今天分享就到这里&#xff0c;谢…...

【MySQL 数据库】之--基础知识

1. MySQL 数据库基础概念 数据库: 逻辑上存储和管理数据的集合。MySQL 是一个常用的关系型数据库管理系统。 2. 创建数据库 要创建一个新的数据库&#xff0c;可以使用 CREATE DATABASE 语句。 语法: CREATE DATABASE 数据库名; 示例: CREATE DATABASE my_database; 注意事…...

Flume面试整理-如何处理Flume中的数据丢失

在Apache Flume中,数据丢失是一个可能出现的严重问题,特别是在处理大规模数据时。数据丢失通常会发生在数据从Source(源)到Channel(通道),或从Channel到Sink(汇)传输的过程中。如果不处理得当,Flume的崩溃或网络故障可能会导致丢失的数据无法恢复。以下是几种常见的F…...

文件处理新纪元:微信小程序的‘快递员’与‘整理师’

嗨&#xff0c;我是中二青年阿佑&#xff0c;今天阿佑将带领大家如何通过巧妙的文件处理功能&#xff0c;让用户体验从‘杂乱无章’到‘井井有条’的转变&#xff01; 文章目录 微信小程序的文件处理文件上传&#xff1a;小程序的“快递服务”文件下载&#xff1a;小程序的“超…...

应付账款优化,自动化管理5要点

优化应付账款流程对企业现金流至关重要。通过自动化、规范采购订单、管理供应商、设计高效流程及保留数字记录&#xff0c;可显著提升效率与精确度。ZohoBooks在线财务记账软件助您简化应付账款处理&#xff0c;确保业务顺畅。 1、自动化您的应付账款流程 通过自动化你的应付账…...

Win安装Redis

目录 1、下载 2、解压文件并修改名称 3、前台简单启动 4、将redis设置成服务后台启动 5、命令启停redis 6、配置文件设置 1、下载 【下载地址】 2、解压文件并修改名称 3、前台简单启动 redis-server.exe redis.windows.conf 4、将redis设置成服务后台启动 redis-server -…...

手把手带你安装U9【win10+sql+U9】,同样适用U9C的安装

一、Win10操作系统设置 1、Windows 10内置账号administrator启用 a、登录到Windows 10系统以后,鼠标右键点击桌面左下角“win图标”,在弹出画面选择“命令提示符(管理员)”或”windows power shell(管理员)”,如下图: b、在”命令提示符(管理员)”或”windows power sh…...

若依前后端框架学习——新建模块(图文详解)

若依框架—新建模块 一、项目地址1、后端启动2、前端启动 二、生成代码1、添加菜单2、创建表结构3、生成代码2、编辑一些基本信息&#xff0c;然后点击提交3、生成代码&#xff0c;压缩包里有前端和后端代码 三、配置后端模块1、新建模块2. 修改pom.xlm2.1 修改第一个pom.xml 2…...

【LaTeX和Word版】写论文时如何调整公式和文字的间距

在撰写论文时&#xff0c;公式和文字段落的间距可能会显得不一致&#xff0c;特别是插入的公式占用单独一行时。这种情况下&#xff0c;可以通过以下两种方法来调整公式和文字段落的间距&#xff0c;使论文排版看起来更加整齐和一致。 1. 使用 LaTeX 调整段落间距 (1) 调整行…...

快乐数--双指针

一&#xff1a;题目 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代码编写 int Sum(int n){int sum 0;while(n){sum pow(n%10,2);n / 10;}return sum;}bool isHappy(int n) {int slow n,fast Sum(n);while(slow …...

论文阅读-三维结构几何修复(导-4)

摘要 解决了3D数字模型中大洞修复的问题。 通过基于字典学习的方法解决了缺失区域推断问题&#xff0c;该方法利用从单个自相似结构和在线深度数据库中得出的几何先验。利用几何先验提供的线索&#xff0c;从洞的边界周围自适应地传播局部3D表面平滑性来恢复底层表面。在合成…...

数字货币交易所源码开发:场外(OTC)与币币交易所系统的构建指南

在区块链技术迅速发展的推动下&#xff0c;数字货币市场的需求大幅增加。数字货币交易所作为加密货币的主要交易场所&#xff0c;成为了开发者和企业关注的焦点。市场上有多种交易模式可供选择&#xff0c;最常见的是场外交易&#xff08;OTC&#xff09;和币币交易。本篇文章将…...

C++ 进阶:类相关特性的深入探讨

⭐在对C 中类的6个默认成员函数有了初步了解之后&#xff0c;现在我们进行对类相关特性的深入探讨&#xff01; &#x1f525;&#x1f525;&#x1f525;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09; 【C】类的默认成员函数&#xff1a;深入剖…...

C++ 多态、虚析构、模板类、常函数、虚继承、虚函数和纯虚函数相关知识和问题总结

1. C 中的多态 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要特性&#xff0c;它允许使用相同的接口来表示不同的类型。由于派生类重写基类方法&#xff0c;然后用基类引用指向派生类对象&#xff0c;调用方法时候会进行动态绑定&#xff0c;这就是多态…...

计算机组成原理一句话

文章目录 计算机系统概述存储系统指令系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&…...

【Linux】僵尸进程和孤儿进程

一、僵尸进程 何为僵尸进程&#xff1f; 在 Unix/Linux 系统中&#xff0c;正常情况下&#xff0c;子进程是通过父进程创建的&#xff0c;且两者的运行是相互独立的&#xff0c;父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时&#xff…...

Patchcore运行过程

论文github地址&#xff1a;https://github.com/amazon-science/patchcore-inspection 平台&#xff1a;autodl云服务器 1.将下载的代码上传到autodl-tmp/PatchCore里面解压&#xff0c;将数据集上传path_to_mvtec_folder/mvtec里&#xff0c;目录结构如图 2.安装依赖 cd au…...

一小时快速入门Android GPU Inspector

本文介绍如何使用 Android GPU Inspector (AGI) 对Android 应用进行系统性能分析和帧性能分析 。面向熟悉Android图形的开发者。 待分析应用需要的前置条件 (1) 将应用设置为可调试状态 <application [...] android:debuggable"true">&#xff08;2&#xff09…...

二叉树展开为链表

二叉树展开为链表 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...