平衡二叉树排序树的操作

数据结构学习笔记(12)----平衡二叉排序树 定义: 左子树与右子树的高度之差的绝对值小于等于1 左右子树也是平衡二叉树 a.平衡因子定义: 节点的左子树与右子树的深度之差** 例如: 平衡树的平衡方法:(1)LL型 B = A->lchild; A->lchild = B->rchild; B->rchild = A; A->bf = 阅读详情

package com.utils;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**

  • 平衡二叉树

  • 定义:首先它是一种特殊的二叉排序树,其次它的左子树和右子树都是平衡二叉树,

  • 且左子树和右子树的深度之差不超过1

  • 平衡因子:可以定义为左子树的深度减去右子树的深度

  • 平衡二叉树是对二叉排序树的优化,防止二叉排序树在最坏情况下平均查找时间为n,

  • 二叉排序树在此时形如一个单链表

  • 平衡二叉树查找元素的次数不超过树的深度,时间复杂度为logN
    /
    public class AVLTree {
    /
    *

    • 根节点
      */
      private Entry root = null;

    /**

    • 树中元素个数
      */
      private int size = 0;

    public AVLTree(){

    }

    public int size(){
    return size;
    }

    /**

    • @param p 最小旋转子树的根节点
    • 向左旋转之后p移到p的左子树处,p的右子树B变为此最小子树根节点,
    • B的左子树变为p的右子树
    • 比如: A(-2) B(1)
    •          \        左旋转       /   \
      
    •         B(0)     ---->       A(0)   \       
      
    •         /   \                   \    \
      
    •       BL(0)  BR(0)              BL(0) BR(0) 
      
    • 旋转之后树的深度之差不超过1
      */
      private void rotateLeft(Entry p) {
      System.out.println(“绕”+p.element+“左旋”);
      if(p!=null){
      Entry r = p.right;
      p.right = r.left; //把p右子树的左节点嫁接到p的右节点,如上图,把BL作为A的右子节点
      if (r.left != null) //如果B的左节点BL不为空,把BL的父节点设为A
      r.left.parent = p;
      r.parent = p.parent; //A的父节点设为B的父节点
      if (p.parent == null) //如果p是根节点
      root = r; //r变为父节点,即B为父节点
      else if (p.parent.left == p) //如果p是左子节点
      p.parent.left = r; //p的父节点的左子树为r
      else //如果p是右子节点
      p.parent.right = r; //p的父节点的右子树为r
      r.left = p; //p变为r的左子树,即A为B的左子树
      p.parent = r; //同时更改p的父节点为r,即A的父节点为B
      }
      }

    /**

    • @param p 最小旋转子树的根节点
    • 向右旋转之后,p移到p的右子节点处,p的左子树B变为最小旋转子树的根节点
    • B的右子节点变为p的左节点、
    • 例如: A(2) B(-1)
    •        /         右旋转          /    \
      
    •      B(0)       ------>         /     A(0)
      
    •     /   \                      /      /
      
    •   BL(0) BR(0)                BL(0)  BR(0) 
      

    */
    private void rotateRight(Entry p){
    System.out.println(“绕”+p.element+“右旋”);
    if(p!=null){
    Entry l = p.left;
    p.left = l.right; //把B的右节点BR作为A的左节点
    if (l.right != null) //如果BR不为null,设置BR的父节点为A
    l.right.parent = p;
    l.parent = p.parent; //A的父节点赋给B的父节点
    if (p.parent == null) //如果p是根节点
    root = l; //B为根节点
    else if (p.parent.right == p) //如果A是其父节点的左子节点
    p.parent.right = l; //B为A的父节点的左子树
    else //如果A是其父节点的右子节点
    p.parent.left = l; //B为A的父节点的右子树
    l.right = p; //A为B的右子树
    p.parent = l; //设置A的父节点为B
    }
    }

    /**

    • 平衡而二叉树的插入操作
    • 基本原理为:
    • 1.首先如同二叉排序树一般,找到其要插入的节点的位置,并把元素插入其中;
    • 2.自下向上进行回溯,回溯做两个事情:
    • (1)其一是修改祖先节点的平衡因子,当插入 一个节点时只有根节点到插入节点
    • 的路径中的节点的平衡因子会被改变,而且改变的原则是当插入节点在某节点(称为A)
    • 的左子树 中时,A的平衡因子(称为BF)为BF+1,当插入节点在A的右子树中时A的BF-1,
    • 而判断插入节点在左子树中还是右子树中只要简单的比较它与A的大小
    • (2)在改变祖先节点的平衡因子的同时,找到最近一个平衡因子大于2或小于-2的节点,
    • 从这个节点开始调整最小不平衡树进行旋转调整,关于如何调整见下文。
    • 由于调整后,最小不平衡子树的高度与插入节点前的高度相同,故不需继续要调整祖先节点。
    • 这里还有一个特殊情况,如果调整BF时,发现某个节点的BF变为0了,则停止向上继续调整,
    • 因为这表明此节点中高度小的子树增加了新节点,高度不变,那么祖先节点的BF自然不变。

    */
    public boolean add(E element){
    Entry t = root;
    if(t == null){
    root = new Entry(element,null);
    size = 1;
    return true;
    }
    int cmp;
    Entry parent; //保存t的父节点
    Comparable<? super E> e = (Comparable<? super E>) element;
    //从根节点向下搜索,找到插入位置
    do {
    parent = t;
    cmp = e.compareTo(t.element);
    if(cmp < 0){
    t = t.left;
    }else if(cmp > 0){
    t = t.right;
    }else{
    return false;
    }
    } while (t!=null);

     Entry<E> child = new Entry(element,parent);
     if(cmp < 0){
         parent.left = child;
         
     }else{
         parent.right = child;    
     }
     //自下向上回溯,查找最近不平衡节点
     while(parent!=null){
         cmp = e.compareTo(parent.element);
         if(cmp < 0){    //插入节点在parent的左子树中
             parent.balance++;
         }else{             //插入节点在parent的右子树中
             parent.balance--;
         }
         if(parent.balance == 0){    //此节点的balance为0,不再向上调整BF值,且不需要旋转
             break;
         }
         if(Math.abs(parent.balance) == 2){    //找到最小不平衡子树根节点
             fixAfterInsertion(parent);
             break;                    //不用继续向上回溯
         }
         parent = parent.parent;
     }
     size ++;
     return true;
    

    }

    /**

    • 调整的方法:
    • 1.当最小不平衡子树的根(以下简称R)为2时,即左子树高于右子树:
    • 如果R的左子树的根节点的BF为1时,做右旋;
    • 如果R的左子树的根节点的BF为-1时,先左旋然后再右旋
    • 2.R为-2时,即右子树高于左子树:
    • 如果R的右子树的根节点的BF为1时,先右旋后左旋
    • 如果R的右子树的根节点的BF为-1时,做左旋
    • 至于调整之后,各节点的BF变化见代码
      */
      private void fixAfterInsertion(Entry p){
      if(p.balance == 2){
      leftBalance§;
      }
      if(p.balance == -2){
      rightBalance§;
      }
      }

    /**

    • 做左平衡处理
    • 平衡因子的调整如图:
    •     t                       rd
      
    •   /   \                   /    \
      
    •  l    tr   左旋后右旋    l       t
      
    • / \ -------> / \ / \
    • ll rd ll rdl rdr tr
    •   /   \
      
    • rdl  rdr
      
    • 情况2(rd的BF为0)
    •     t                       rd
      
    •   /   \                   /    \
      
    •  l    tr   左旋后右旋    l       t
      
    • / \ -------> / \ \
    • ll rd ll rdl tr
    •   /   
      
    • rdl  
      
    • 情况1(rd的BF为1)
    •     t                       rd
      
    •   /   \                   /    \
      
    •  l    tr   左旋后右旋    l       t
      
    • / \ -------> / / \
    • ll rd ll rdr tr
    •       \
      
    •      rdr
      
    • 情况3(rd的BF为-1)
    •     t                         l
      
    •   /       右旋处理          /    \
      
    •  l        ------>          ll     t
      
    • / \ /
    • ll rd rd
    • 情况4(L等高)
      */
      private boolean leftBalance(Entry t){
      boolean heightLower = true;
      Entry l = t.left;
      switch (l.balance) {
      case LH: //左高,右旋调整,旋转后树的高度减小
      t.balance = l.balance = EH;
      rotateRight(t);
      break;
      case RH: //右高,分情况调整
      Entry rd = l.right;
      switch (rd.balance) { //调整各个节点的BF
      case LH: //情况1
      t.balance = RH;
      l.balance = EH;
      break;
      case EH: //情况2
      t.balance = l.balance = EH;
      break;
      case RH: //情况3
      t.balance = EH;
      l.balance = LH;
      break;
      }
      rd.balance = EH;
      rotateLeft(t.left);
      rotateRight(t);
      break;
      case EH: //特殊情况4,这种情况在添加时不可能出现,只在移除时可能出现,旋转之后整体树高不变
      l.balance = RH;
      t.balance = LH;
      rotateRight(t);
      heightLower = false;
      break;
      }
      return heightLower;
      }

    /**

    • 做右平衡处理
    • 平衡因子的调整如图:
    •       t                               ld
      
    •    /     \                          /     \
      
    •  tl       r       先右旋再左旋     t       r
      
    •         /   \     -------->      /   \    /  \
      
    •       ld    rr                 tl   ldl  ldr rr
      
    •      /  \
      
    •   ldl  ldr
      
    •   情况2(ld的BF为0)
      
    •       t                               ld
      
    •    /     \                          /     \
      
    •  tl       r       先右旋再左旋     t       r
      
    •         /   \     -------->      /   \       \
      
    •       ld    rr                 tl   ldl      rr
      
    •      /  
      
    •   ldl  
      
    •   情况1(ld的BF为1)
      
    •       t                               ld
      
    •    /     \                          /     \
      
    •  tl       r       先右旋再左旋     t       r
      
    •         /   \     -------->      /        /  \
      
    •       ld    rr                 tl        ldr rr
      
    •         \
      
    •         ldr
      
    •   情况3(ld的BF为-1)
      
    •       t                                  r
      
    •         \          左旋                /   \
      
    •          r        ------->           t      rr     
      
    •        /   \                          \
      
    •       ld   rr                         ld
      
    •    情况4(r的BF为0)   
      

    */
    private boolean rightBalance(Entry t){
    boolean heightLower = true;
    Entry r = t.right;
    switch (r.balance) {
    case LH: //左高,分情况调整
    Entry ld = r.left;
    switch (ld.balance) { //调整各个节点的BF
    case LH: //情况1
    t.balance = EH;
    r.balance = RH;
    break;
    case EH: //情况2
    t.balance = r.balance = EH;
    break;
    case RH: //情况3
    t.balance = LH;
    r.balance = EH;
    break;
    }
    ld.balance = EH;
    rotateRight(t.right);
    rotateLeft(t);
    break;
    case RH: //右高,左旋调整
    t.balance = r.balance = EH;
    rotateLeft(t);
    break;
    case EH: //特殊情况4
    r.balance = LH;
    t.balance = RH;
    rotateLeft(t);
    heightLower = false;
    break;
    }
    return heightLower;
    }

    /**

    • 查找指定元素,如果找到返回其Entry对象,否则返回null
      */
      private Entry getEntry(Object element) {
      Entry tmp = root;
      Comparable<? super E> e = (Comparable<? super E>) element;
      int c;
      while (tmp != null) {
      c = e.compareTo(tmp.element);
      if (c == 0) {
      return tmp;
      } else if (c < 0) {
      tmp = tmp.left;
      } else {
      tmp = tmp.right;
      }
      }
      return null;
      }

    /**

    • 平衡二叉树的移除元素操作

    */
    public boolean remove(Object o){
    Entry e = getEntry(o);
    if(e!=null){
    deleteEntry(e);
    return true;
    }
    return false;
    }

    private void deleteEntry(Entry p){
    size --;
    //如果p左右子树都不为空,找到其直接后继,替换p,之后p指向s,删除p其实是删除s
    //所有的删除左右子树不为空的节点都可以调整为删除左右子树有其一不为空,或都为空的情况。
    if (p.left != null && p.right != null) {
    Entry s = successor§;
    p.element = s.element;
    p = s;
    }
    Entry replacement = (p.left != null ? p.left : p.right);

     if (replacement != null) {        //如果其左右子树有其一不为空
         replacement.parent = p.parent;
         if (p.parent == null)    //如果p为root节点
             root = replacement;
         else if (p == p.parent.left)    //如果p是左孩子
             p.parent.left  = replacement;    
         else                            //如果p是右孩子
             p.parent.right = replacement;
    
         p.left = p.right = p.parent = null;        //p的指针清空
         
         //这里更改了replacement的父节点,所以可以直接从它开始向上回溯
         fixAfterDeletion(replacement);    
    
     } else if (p.parent == null) { // 如果全树只有一个节点
         root = null;
     } else {  //左右子树都为空
         fixAfterDeletion(p);    //这里从p开始回溯
         if (p.parent != null) {
             if (p == p.parent.left)
                 p.parent.left = null;
             else if (p == p.parent.right)
                 p.parent.right = null;
             p.parent = null;
         }
     }    
    

    }

    /**

    • 返回以中序遍历方式遍历树时,t的直接后继
      */
      static Entry successor(Entry t) {
      if (t == null)
      return null;
      else if (t.right != null) { //往右,然后向左直到尽头
      Entry p = t.right;
      while (p.left != null)
      p = p.left;
      return p;
      } else { //right为空,如果t是p的左子树,则p为t的直接后继
      Entry p = t.parent;
      Entry ch = t;
      while (p != null && ch == p.right) { //如果t是p的右子树,则继续向上搜索其直接后继
      ch = p;
      p = p.parent;
      }
      return p;
      }
      }

    /**

    • 删除某节点p后的调整方法:
    • 1.从p开始向上回溯,修改祖先的BF值,这里只要调整从p的父节点到根节点的BF值,
    • 调整原则为,当p位于某祖先节点(简称A)的左子树中时,A的BF减1,当p位于A的
    • 右子树中时A的BF加1。当某个祖先节点BF变为1或-1时停止回溯,这里与插入是相反的,
    • 因为原本这个节点是平衡的,删除它的子树的某个节点并不会改变它的高度
    • 2.检查每个节点的BF值,如果为2或-2需要进行旋转调整,调整方法如下文,
    • 如果调整之后这个最小子树的高度降低了,那么必须继续从这个最小子树的根节点(假设为B)继续
    • 向上回溯,这里和插入不一样,因为B的父节点的平衡性因为其子树B的高度的改变而发生了改变,
    • 那么就可能需要调整,所以删除可能进行多次的调整。

    /
    private void fixAfterDeletion(Entry p){
    boolean heightLower = true; //看最小子树调整后,它的高度是否发生变化,如果减小,继续回溯
    Entry t = p.parent;
    Comparable<? super E> e = (Comparable<? super E>)p.element;
    int cmp;
    //自下向上回溯,查找不平衡的节点进行调整
    while(t!=null && heightLower){
    cmp = e.compareTo(t.element);
    /
    *
    * 删除的节点是右子树,等于的话,必然是删除的某个节点的左右子树不为空的情况
    * 例如: 10
    * /
    * 5 15
    * /
    * 3 6
    * 这里删除5,是把6的值赋给5,然后删除6,这里6是p,p的父节点的值也是6。
    * 而这也是右子树的一种
    */
    if(cmp >= 0 ){
    t.balance ++;
    }else{
    t.balance --;
    }
    if(Math.abs(t.balance) == 1){ //父节点经过调整平衡因子后,如果为1或-1,说明调整之前是0,停止回溯。
    break;
    }
    Entry r = t;
    //这里的调整跟插入一样
    if(t.balance == 2){
    heightLower = leftBalance®;
    }else if(t.balance==-2){
    heightLower = rightBalance®;
    }
    t = t.parent;
    }
    }

    private static final int LH = 1; //左高
    private static final int EH = 0; //等高
    private static final int RH = -1; //右高

    /**

    • 树节点,为方便起见不写get,Set方法
      */
      static class Entry{
      E element;
      Entry parent;
      Entry left;
      Entry right;
      int balance = EH; //平衡因子,只能为1或0或-1

      public Entry(E element,Entry parent){
      this.element = element;
      this.parent = parent;
      }

      public Entry(){}

      @Override
      public String toString() {
      return element+" BF="+balance;
      }

    }

    //返回中序遍历此树的迭代器,返回的是一个有序列表
    private class BinarySortIterator implements Iterator{
    Entry next;
    Entry lastReturned;

     public BinarySortIterator(){
         Entry<E> s = root;
         if(s !=null){
             while(s.left != null){    //找到中序遍历的第一个元素
                 s = s.left;
             }
         }
         next = s;    //赋给next
     }
     
     @Override
     public boolean hasNext() {
         return next!=null;
     }
    
     @Override
     public E next() {
         Entry<E> e = next;
         if (e == null)
             throw new NoSuchElementException();
         next = successor(e);
         lastReturned = e;
         return e.element;
     }
    
     @Override
     public void remove() {
         if (lastReturned == null)
             throw new IllegalStateException();
         // deleted entries are replaced by their successors
         if (lastReturned.left != null && lastReturned.right != null)
             next = lastReturned;
         deleteEntry(lastReturned);
         lastReturned = null;
     }
    

    }

    public Iterator itrator(){
    return new BinarySortIterator();
    }

    private int treeHeight(Entry p){
    if(p == null){
    return -1;
    }
    return 1 + Math.max(treeHeight(p.left), treeHeight(p.right));
    }

    //测试,你也可以任意测试
    public static void main(String[] args) {
    AVLTree tree = new AVLTree();
    System.out.println("------添加------");
    tree.add(50);
    System.out.print(50+" “);
    tree.add(66);
    System.out.print(66+” “);
    for(int i=0;i<10;i++){
    int ran = (int)(Math.random() * 100);
    System.out.print(ran+” “);
    tree.add(ran);
    }
    System.out.println(”------删除------");
    tree.remove(50);
    tree.remove(66);

     System.out.println();
     Iterator<Integer> it = tree.itrator();
     while(it.hasNext()){
         System.out.print(it.next()+" ");
     }
    

    }
    }

【数据结构】查找:动态查找表(二叉排序树/BST/二叉搜索树,平衡二叉树/AVL) #笔记整理 动态查找表——基于树表的查找法 动态查找表的特点: 表结构本身在查找过程中动态生成,即对于给定值 key,若表中存在关键字等于 key 的记录,则查找成功,否则插入关键字等于 key 的记录。 动态查找表的主要运算 - 创建、销毁 - 查找、插入和删除 - 遍历 二叉排序树(二叉搜素树、二叉查找树)BST (Binary Sort Tree)/(Binary Search Tree)... 阅读详情

相关推荐

平衡二叉排序树(完整案例详解及完整C代码实现)

写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。 目录: 1.平衡二叉树简介 2.二叉排序.

记录博主学到的点滴 6257

数据结构复习过程中的笔记

知识点盲区 主要为在做题过程中发现的知识点盲区,自己的找到的坑,逐步一点一点慢慢的填上 **1、线性表的基本操作 线性表的操作都是从第i个位置,而不是下标, 插入元素需要后移动n-i+1 删除元素需要移动n-i 查找元素i 2、已知邻接矩阵,计算i结点的入度,删除所有i结点出发的狐头 3、二叉排序树的中序遍历是递增序列 4、拓扑排序的作用 5、数据结构的逻辑结构 6、广义表转化为树 根据广义表构建二叉树 7、排序的插入次数 最好情况下,序列已经有序,每次选取递增序列进行比较,不需要移动元素,时间复杂度为O(

李昂的博客 1263

C++实现平衡二叉树

C++实现平衡二叉(排序)树

cctv1324的博客 1642

二叉树:平衡二叉树

平衡二叉树

qq_46785243的博客 2187

Codex接入CCSwitch:本地代理与模型路由配置指南

在AI编程工具链中,本地代理与模型路由是连接智能体与模型服务的核心桥梁。Codex作为OpenAI推出的编程智能体,虽然具备强大的仓库理解和自主编码能力,但其默认模型链路固定,导致在多模型切换、内网统一管理及成本控制上存在天然瓶颈。CCSwitch正是为解决这一痛点而生的本地代理工具,它通过OpenAI兼容协议将Codex的请求透明转发至DeepSeek、通义千问等第三方模型服务,使模型切换如同点击按钮般简单。本文从本地代理和模型路由器的基础原理切入,系统讲解Codex与CCSwitch的安装配置、模型ID

weixin_33910460的博客 427

Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案

问题描述 Linux内存使用量超过阈值,使得sap应用程序无可用内存,最终导致程序崩溃。 问题原因 自己查阅了一些资料,也基于zabbix的可用内存和实际不太一样入手去找原因发现问题出现于Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,而SAP-HANA的日志文件很大...

liuxiangyang_的博客 6711

查找之平衡二叉树

平衡二叉树 1.性质 首先必须是一个二叉搜索树 左右子树深度相差绝对值不超过1 平衡因子BF:该结点右子树的深度减去它的左子树的深度,因此平衡二叉树上所有结点的平衡因子只可能是1,-1或0 2.AVL树代码实现 创建AVL树结构 typedef struct AVLnode { int data; AVLtree*lchild; AVLtree*rchild; int bf; }AVLnode; typedef struct AVLtree { AVLnode*r

知世同学的小书房 544

Linux 设置双网卡通信,外网网卡和内网网卡

背景,Linux 主机已经安装了内网、外网 2 张网卡,目前外网网络已通,需要设置内网网卡转发通内网 内网需要通信的设备的网段,如果 10.99.0.0 代表 10.99 网段的所有 IP 表示 10.xx 网段走 10.xx.xx.xx 这个网关转发 :内网网卡设备示例 2、设置启动自动生效 打开 文件,如果没有则创建该文件,然后在文件内写入如下的内容修改上面的语句 为 即可 示例...

简简单单Onlinezuozuo 6605

二叉搜索树(二叉排序树)与平衡二叉树

二叉搜索树与平衡二叉树

weixin_61611746的博客 1415

基于STM32、HAL库、I2C接口的姿态传感器/陀螺仪之ICM-42670-P驱动 C语言程序设计

/ 设置加速度计和陀螺仪的工作模式。// 读取加速度计和陀螺仪数据。

corlin6688的博客 1180

QGIS004:【05矢量属性表】-保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段

摘要:QGIS矢量属性表工具箱包括保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段等选项,本文介绍各选项的基本操作。

qq_31762031的博客 2312

二叉排序树和平衡二叉树

首先介绍概念;二叉排序树指的是左值子树小于根节点小于右子树左子树结点值< 根结点值< 右子树结点值这就使得在中序遍历的时候可以得到一个有序地序列解析来介绍一下二叉树的查找操作解释一下代码,其实就是采用了一个while循环首先构建一个结构体BSTnode 然后在查找函数里面调用一下首先建立的BST(二叉排序树)接下来重点关注一下while循环,当树不为空的时候且关键字不相同的时候,借助二叉排序树左<中<右的特性来进行循环条件的设立。当最终满足key相等的时候返回T。

m0_64845434的博客 878

地下管网巡检机器人:基于YOLOv8与UI界面的智能化系统设计与实现

通过YOLOv8模型的目标检测功能结合实时视频流,我们能够实现对地下管网巡检机器人的智能化控制。系统通过图像识别技术帮助巡检人员快速识别管道中的各种缺陷和障碍物,从而提高巡检效率和准确性。未来,我们可以继续优化模型,增加更多的目标类别,并通过强化学习等方法提高机器人的自主巡检能力。此外,随着硬件技术的发展,未来的巡检机器人可能会具备更强的感知能力和更高的智能水平。

YOLO 530

二叉排序树与平衡二叉排序树的转化

二叉排序树与平衡二叉树的转化开始单独看视频的时候感觉是明白的,但是看到题就不知所措了,如果单向旋转还可以,碰到LR型和RL型的就有困难了,所以一定要写个博客来把它弄懂。这篇博客会首先介绍二叉排序树,再介绍什么是平衡二叉树,为什么要会有平衡二叉排序树,最后来看转化。 1.什么是二叉排序树?     二叉排序树(Binary Sort Tree)又称查找二叉树,它可以是一个空树,或者要满足

颗粒归仓 5314

基于DeepFashion2和YOLOv12的服装检测系统:从数据集构建到UI界面实现

官方网站:数据集大小: 约80GB(压缩包)包含训练集、验证集和测试集数据集目录结构:text复制下载├── train/└── test/├── image/├── annos/Backbone优化:使用更高效的CSPNet结构Neck增强:引入BiFPN特征金字塔网络Head改进:使用解耦头(Decoupled Head)提升分类和定位精度损失函数:采用CIoU损失和分类Focal Loss训练策略:引入Mosaic数据增强和自适应锚框python复制下载。

YOLO 498

【零基础入门unity游戏开发——unity通用篇30】Resources资源加载(基于unity6开发介绍)

Resources资源加载(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4116

树表——二叉排序树与平衡二叉树

哎

weixin_62917800的博客 2581

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

二叉排序树与平衡二叉树的实现-数据结构课设

重庆理工大学(CQUT)C语言数据结构课程设计——二叉排序树与平衡二叉树

西唯兵欧泡的博客 992

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据结构课设(五)二叉排序树与平衡二叉树的实现

二叉排序树与平衡二叉树的实现。分别采用二叉链表和顺序表作存储结构,实现对二叉衡二叉树的操作。具体要求如下: (1)用二叉链表作存储结构: ①读入一个整数序列L(要求该整数序列从磁盘文件读取),生成一棵二叉排序树②对二叉排序树T作中序遍历,输出结果。③计算二叉排序树T查找成功的平均查找长度,输出结果。④输入元素x,查找二叉排序树T。若存在含x的结点,则删除该结点,并作中序遍历(执行操作②);否则输出信息“无x”。⑤用数列L,生成一棵平衡的二叉排序树BT。如果当插人新元素之后,发现当前的二叉排序树BT

2301_76676374的博客 1828

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【数据结构】二叉排序树;平衡二叉树的知识点学习总结

二叉排序树:定义、基本操作和C语言实现基本操作。 平衡二叉树:定义、基本操作和调整不平衡。

小人物,大梦想! 670

【数据结构】查找2——树表的查找——二叉排序树、平衡二叉树

【数据结构】查找2——树表的查找——二叉排序树、平衡二叉树

FishC的博客 880

二叉排序树、平衡二叉树以及红黑树

现实生活中,有很多找东西的例子,比如在学校找某个人,在驿站找快递,在信息登记表上查找某个人的信息,那么在计算机科学中,具体有哪些可以加快查找的算法?下面我们就来看看其中的动态查找算法,动态查找的意思是当你查找某个键值的信息,若存在则输出,否则将插入该键值为后续进行查找。 二叉排序树首先我们来看看二叉排序树,二叉排序树有点类似于二分查找的思路,但是它用树的形式来表示查找的方向。 定义: (1)一个

Ajay666的博客 1493

软件设计师之动态查找表:二叉排序树与平衡二叉树解析

在软件开发的学习过程中,数据结构是非常重要的基石,而查找算法作为数据处理的常用手段,其效率直接影响到程序的性能。今天,咱们一起深入学习动态查找表中的二叉排序树和平衡二叉树相关知识,希望能和大家共同进步,提升对数据结构的理解和运用能力。

wj_rdk的博客 1313

数据结构-----平衡二叉树

前面去构建一个二叉排序树,非常简单,只需要排序就行了,那构建一个平衡二叉树不仅仅要考虑到排序问题,还要考虑到左右子树高度不大于1才行,下面我介绍一种通过旋转的方法来去构建平衡二叉树。

m0_73633088的博客 1万+

查找2—树表的查找(二叉排序树;平衡二叉树;B树)

前言: 查找部分的知识就是线性表的查找,树表的查找和散列表的查找。这里我们就来看看树表查找的知识。首先来看一下目录,看看我们本片博客的基本内容: 一、二叉排序树 首先,我们要讲二叉排序树的定义。书上或者其它资料上给出的二叉排序树的定义是递归的。用自己的话来总结就是,首先二叉排序树,根节点的值比左子树小,比右子树大。而且它的子树也满足这个规则(有一个重要的性质就是中序遍历一颗二叉排序树可以得到一个...

充满好奇的threecat 655

Java集合源码分析(五):平衡二叉树(AVL Tree)

在上一章的文章中,我们讲到了二叉排序树,它很好的平衡了插入与查找的效率,但二叉排序树如果不平衡,那么查找效率就会大大降低,今天要讲的这个平衡二叉树就是一种解决这个问题的方法。 一、平衡二叉树的定义 平衡二叉树 是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二叉排序树。意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1 。我们将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF (Balance Fac

不会编程的派大星的博客 318
上一篇: 二叉树的链式存储结构
下一篇: IP流量包分析
heiyay
博客等级 码龄8年 617粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值