[数据结构]深入浅出讲解二叉树-平衡二叉树-左右旋转

news2024/11/20 16:33:26

树是一种数据结构,单位为Node(节点)。不同于链表的直线排列,树呈现一种自上而下的分层排序规则。

        树->数据结构:
        单元为Node(节点)->当这样的节点多了 就可以关联出不同的形态
        一个父节点有一个左子节点,有一个右子节点
        有的节点下方没有其他数据 也就没有左子节点和右子节点了
        事实上,每一个节点都是一个独立的对象。存在着:
        a.本身储存的值 b.父节点地址 c.左子节点地址 d.右子节点地址
        看到这里,我们会想到链表。因此链表也是有数据域和指针域
        你会发现 如果我们聚焦目光于一个节点
        同链表相比,二叉树的节点在数据域上是相差无几的
        只是指针域被分成了三个部分:父节点的地址,左子节点的地址,右子节点的地址
        树结构中,普及一些专业名词:
        1.度:每一个节点的子节点数称为度。普通二叉树的非根节点和最底层节点的度均是2
        2.二叉树:我们同样观察到,有一种树最上层的节点没有父节点
        最下层的节点没有左右子节点,我们将一种度<=2的的数据结构称为二叉树
        3.树的高度:也就是树的总层数。
        4.根节点:最上层的节点(只有唯一一个)
        5.根节点的左子树:这个左子树相当于以其左子节点作为一棵新树的根节点
        由这个左子节点衍生出来的一整棵树都是根节点的左子树
        6.根节点的右子树:原理如上。
        7.二叉查找树:
        二叉查找树是一种特殊的二叉树,它具有以下性质:
          1.每一个节点上最多有两个子节点(首先是一个二叉树)
          2.任意节点左子树的大小均小于当前节点
          3.任意节点的右子树的大小均大于当前节点
        添加原则:
          1.小的存左边
          2.大的存右边
          3.一样大的不存
        8.二叉树的遍历方式
        a.前序遍历:从根节点开始,按照 当前->左子树->右子树顺序遍历
        b.中序遍历(最重要):按照左子树->当前节点->右子树顺序遍历
        c.后序遍历:按照左子树->当前->右子树的顺序进行遍历
        d.层序遍历:从上到下一个一个取 注意 先左后右
        这个东西很好理解 前序就是当前节点最先获取 中序就是当前节点在中间获取 后序就是当前节点在最后获取
        ——————————————————————————————————————————————————————————————————————
        二叉查找树的弊端:
        7 10 11 12 13 按照二叉查找数
        首先存7作为根节点 然后10放11后面
         大概的样子就是
                7
                 10
                   11
                     12
                      13
         现在这一棵二叉树似乎变成了一个单向链表 但是此时两边的树是不一样长的
         这样的树是有问题的 这样的查询效率过低了 如果我要查询数据13 岂不是要从根节点开始
         找5次才能找到13
         关键点:要提高查询效率 左右的高度要差不多长的树->
         这里我们就引入了一个新的二叉树 这样的二叉树是基于二叉查找树的
         增加一条新的规则:任意节点左右子树的(高度差)不超过1
         (这点很容易迷惑 任意的意思是从上往下的每一个节点)
         不能被根节点的左子树右子树的高度满足条件迷惑
         当你看根节点左右子节点的时候 就会发现可能子节点不满足这个条件
         ————————————————————————————————————————————————————————————————————————
         平衡二叉树的旋转机制:
         规则1:左旋(前提条件:添加了一个节点后,该树不是一颗平衡二叉树)
         规则2:右旋(当添加一个节点之后,该节点不是一棵平衡二叉树)
         研究左旋转规则:
         1.确定支点:从添加的节点开始,不断地朝父节点寻找不平衡点
         2.将根节点的右边往左边拉
         3.原先的右节点变成新的父节点,并且把多余的左子节点出让 给已经降级的根节点当右节点
         研究右旋规则:
         1.发现添加节点后,平衡被破坏了,从被添加的节点开始向上找第一个不平衡的点
         2.找到第一个不平衡的点作为支点
         3.原先的左子节点变成新的父节点,并且把多余的右子节点出让 给已经降级的根节点当左节点
——————————————————————————————————————————————————————————————————————————————
         平衡二叉树需要旋转的四种情况
         1.左左:根节点的左子树的左子树不平衡,导致二叉树不平衡->一次右旋就可以
         2.左右:根节点的左子树的右子树不平衡,导致二叉树不平衡->一次局部左旋和整体一次右旋
         ps:这里很有意思 就是要先把左右问题变成左左问题 再转化为左左的问题
         3.右右:就是根节点的右子树的右子树不平衡,导致二叉树不平衡->一次左旋就可以
         4.右左:根节点的右子树的左子树不平衡,导致二叉树不平衡->一次局部右旋和整体一次左
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11.31链表,之前的数据结构(未完,饼)

根据输入序列建立二叉树 链表 回顾一下二分面积最小 一些性质题回顾 哈夫曼树构建 第十一周——哈夫曼树 5 1 2 2 5 9 37 桶排序 #include <iostream> #include <vector> #include <algorithm> #include<stack> #include<queue> #includ…

软件工程 - 第8章 面向对象建模 - 2 静态建模

静态建模&#xff08;类和对象建模&#xff09; 类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构&#xff0c;在UML中用类图和对象图来表示。 类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛…

Linux MIPI 调试中常见的问题

一、概述 做嵌入式工作的小伙伴知道&#xff0c;有时候程序编写没有调试过程中费时&#xff0c;之间笔记里有 MIPI 摄像头驱动开发的过程&#xff0c;有需要的小伙伴可以参考&#xff1a;Linux RN6752 驱动编写。而我也是第一次琢磨 MIPI 协议&#xff0c;其中有很多不明白的地…

python之pyqt专栏10-键盘事件

需求 通过按键盘的上下左右&#xff0c;移动button的位置。 UI界面设计 代码 # 导入sys模块 import sysfrom PyQt6.QtCore import Qt # PyQt6.QtWidgets模块中导入QApplication, QWidget from PyQt6.QtWidgets import QApplication, QWidget# untitled模块中导入Ui_Form类 f…

进程间通信2

3. system V-IPC 3.1 知识点 ipcs -a查看所有的ipc对象 在系统中他们都使用一种叫做 key 的键值来唯一标识&#xff0c;而且他们都是“持续性”资源——即他 们被创建之后&#xff0c;不会因为进程的退出而消失&#xff0c;而会持续地存在&#xff0c;除非调用特殊的函数或者…

带你手搓阻塞队列——自定义实现

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是——阻塞队列的自定义实现&#xff0c;通过自定义实现一个阻塞队列&#xff0c;可以帮助我们更清晰、更透彻的理解阻塞队列的底层原理。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章…

C++stack

目录 1.什么是stack 2.容器适配器 3.stack的使用 top push pop 4.模拟实现stack 1.什么是stack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。(后进先出) 2. stack是作为容…

进程间通信方式——管道

进程间通信方式——管道 1、管道2、匿名管道2.1 创建匿名管道2.2 进程间通信 3、有名管道3.1 创建有名管道3.2 进程间通信 4、管道的读写行为 原文链接 1、管道 管道的是进程间通信&#xff08;IPC - InterProcess Communication&#xff09;的一种方式&#xff0c;管道的本质…

深入 C 语言和程序运行原理 实战项目代码在CentOS 7上编译

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。 安装gtest 参考博客《使用gtest和lcov测试代码覆盖率》 wget https://github.com/google/googletest/archive/refs/…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

Promise的resolve和reject方法(手写题)

1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…

国内首所国际职业培训学院落户深圳盐田揭幕开业

11月26日&#xff0c;中科国药•中科大有大健康上市企业孵化平台迎来了国内首所国际职业学院——深圳市盐田区国际职业培训学院的正式落成与揭幕仪式。中科大有高新科技有限公司董事长、长江商学院MBA\FMBA金融导师、深圳市中科国药生物医药研究院理事长、深圳市盐田区国际职业…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了&#x1f4a5;我已经后悔了&#x1f62d;后悔没早点学习鸿蒙 HarmonyOS 概念&#xff0c;系统定位 1&#xff1a;鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统&#xff0c;它具有以下特别之处&#xff1a; 2&#xff1a;分布式架构&#xff1a;…

华为鸿蒙工程师成“热门”!最高年薪160万,只看技术不看年龄

引言&#xff1a; 今天&#xff0c;在互联网行业&#xff0c;超过30岁的工程师往往被认为是“码农”的生命周期终点。然而&#xff0c;华为鸿蒙系统的崛起&#xff0c;却再次给予了这些35岁以上的工程师们第二春的机会。国内一线互联网公司纷纷向鸿蒙系统靠拢&#xff0c;导致…

c语言练习13周(1~5)

输入任意整数n求以下公式和的平方根。 读取一系列的整数 X&#xff0c;对于每个 X&#xff0c;输出一个 1,2,…,X 的序列。 编写double fun(int a[M][M])函数&#xff0c;返回二维数组周边元素的平均值&#xff0c;M为定义好的符号常量。 编写double fun(int a[M])函…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类…

Unity 使用Horizontal Layout Group和Toggle制作多个水平开关按钮实现自动排列和单个点击放大后的自动排列。

Unity的布局组件Horizontal Layout Group是很好用的&#xff0c;当然也包括其它布局组件也一样好用。 比如要实现多按钮开关自动水平排列&#xff0c;那么就可以使用它了。 首先我们为按钮创建个父物体&#xff08;我这里使用了Scroll View中的Content作为父物体&#xff09;…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求&#xff1a; 默认一行展示4个卡片&#xff1b;当屏幕小于某个大小的时候&#xff0c;一行展示3个卡片&#xff1b;再小就展示2个&#xff1b;以此类推&#xff0c;最小就展示1个。 效果卡片样式如下图&#xff1a; 默认一行4个 屏幕缩小到某个阈值&#xff0c;一行展示…

11.26电梯控制器设计分析

项目三 电梯控制器设计&#xff08;*****&#xff09; 设计一个多楼层的电梯控制器系统&#xff0c;并能在开发板上模拟电梯运行状态。可以利用按键作为呼叫按键&#xff0c;数码管显示电梯运行时电梯所在楼层&#xff0c;led灯显示楼层叫梯状态。 就是初始默认在1楼&#xff0…

【LeetCode:1657. 确定两个字符串是否接近 | 计数 + 阅读理解】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…