当前位置: 首页 > 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 。展开后的单链表应该与二叉树 先序遍历 顺序相同…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...