数据结构专题——二叉树

使用gsplat进行3D高斯泼溅的方案 gsplat 不是一个软件,而是一个深度优化CUDA的开源Python库。它的作者是 Nerfstudio 团队,这个团队最出名的项目是 Nerfstudio,是对 NeRFs 方法支持最好的一套框架。据其所述,出于对新一代技术的好奇,他们构建了 gsplat 这个库。它支持 Windows/Linux 两个系统,使用前必须准备好 Nvidia 显卡。跑这个项目真是特别费劲,官方的文档支持不够完善,以至于遇到问题,开发者们都只能在issue区里抱团取暖。 阅读详情

什么是二叉树

通俗的讲就是树上每一个节点最多有两个子节点
官方的递归定义是:

  1. 要么二叉树没有根节点,是一颗空树
  2. 要么二叉树由根结点、左子树、右子树组成,且左右子树也都是二叉树

这里有两种特殊的二叉树。

  1. 满二叉树:每一层的结点个数都达到了当层能达到的最大结点数
    在这里插入图片描述
  2. 完全二叉树:除了最下面一层,其他层的节点个数都达到了当曾能达到的最大结点数,且最下面一层只从左到右连续存在若干个结点,而这些连续结点的右边的结点全部不存在
    在这里插入图片描述
    这里再介绍几个常用的概念
    孩子结点:与该结点相连的下一层结点
    父亲结点:与该结点相连的上一层结点
    兄弟结点:拥有同一父亲结点的结点
    祖先结点:该结点的父结点到根结点连线上的所有结点
    子孙结点:该结点以下的所有结点
    注意自己既是自己的祖先结点也是自己的子孙结点

二叉树的存储结构和基本操作

1.二叉树的存储结构

二叉树是以链表的形式来存储的,每个结点由地址域,数据域和两个指针域构成。
创建二叉树的结点类,由于java没有引用,所以需要比C++多增加一个父结点

public class BinaryNode{
    int data; //数据域,使用泛型
    BinaryNode lchild;//左节点
    BinaryNode rchild;//右结点
    BinaryNode pnode; //父结点
    //构造方法
    public BinaryNode(int data) {
   		 this.data = data;
    }
    public  BinaryNode(){
    }
}

2.二叉树的建立查找和修改

创建新结点

new BinaryNode(data)

查找结点

 /**
     * 会把所有data结点的值都改为newdata,使用深度优先的方法遍历整个树
     * @param root 根结点
     * @param data 需要查找并修改的数据
     * @param newdata 修改后的数据
     * @return
     */
    public static  void search(BinaryNode root,int data,int newdata ){
        if(root==null){
            return ; //没有找到该结点,返回
        }
        if(root.data==data){
            root.data=newdata;
        }
        search(root.lchild,data,newdata);
        search(root.rchild,data,newdata);
    }

插入结点
方法一:这里需要定义一个全局变量,因为java中没有引用,没办法将改变后的地址往上传,所以用一个全局变量记录递归上一层的地址

/**
     *  以搜索二叉树的方法插入结点
     * @param root
     * @param x
     */
    private static BinaryNode tree;//定义一个全局变量
    public  static void insert(BinaryNode root,int x){
        //判断是否为空树
        if(root==null){
            BinaryNode node=newNode(x);
            node.pnode=tree;
            if(tree.data<=x){
                tree.rchild=node;
            }else{
                tree.lchild=node;
            }
            return;
        }
        tree=root;
        if(root.data<=x){
            insert(root.rchild,x);
        }else{
            insert(root.lchild,x);
        }
    }

方法二:这个比上面一个方法简单了很多,并且不用定义全局变量,也不用pnode属性,这是因为这个方法在递归前已经判断子节点存不存在,就不用考虑引用的问题了(推荐)

 public  static void insert(BinaryNode root,int x){
        if(root.data<=x&&root.rchild!=null){
            insert(root.rchild,x);//如果右子结点存在且新结点大于等于该结点
        }else if(root.data>x&&root.lchild!=null){
            insert(root.lchild,x);//如果左子结点存在且新结点小该结点
        }else if(root.data<=x){
            root.rchild=new BinaryNode(x);
            return;//如果右子结点不存在且新结点大于等于该结点
        }else{
            root.lchild=new BinaryNode(x);
            return;////如果左子结点不存在且新结点小该结点
        }
    }

建立二叉树

BinaryNode BinaryNode = newNode(3);//创建根结点
insert(BinaryNode,2);
insert(BinaryNode,5);
insert(BinaryNode,7);
insert(BinaryNode,4);
insert(BinaryNode,1);
insert(BinaryNode,9);

二叉树的遍历

先序遍历

 public void preOrder(BinaryNode root){
        if(root==null){
            return ;
        }
        System.out.println(root.data);
        preOrder(root.lchild);
        preOrder(root.rchild);
    }

中序遍历

public void inorder(BinaryNode root){
        if(root==null) {
            return;
        }
        preOrder(root.lchild);
        System.out.println(root.data);
        preOrder(root.rchild);
    }

后序遍历

 public void postorder(BinaryNode root){
        if(root==null) {
            return;
        }
        preOrder(root.lchild);
        preOrder(root.rchild);
        System.out.println(root.data);
    }

层序遍历,Queue是一个接口,LinkedList实现了该接口,使用poll,peek,offer方法

public  void layerOrder(BinaryNode root){

        Queue<BinaryNode> queue = new LinkedList<>();//Queue是一个接口,LinkedList实现了该接口
        queue.offer(root);
        while(!queue.isEmpty()){
            BinaryNode peek=queue.peek();
            System.out.println(peek.data);
            if(peek.lchild!=null)    queue.offer(peek.lchild);
            if(peek.rchild!=null)    queue.offer(peek.rchild);
            queue.poll();
        }
    }

最后一个问题经常考虑的就是给定一棵二叉树的先序和中序,重建这颗二叉树,只有有中序排列的二叉树才能重建

    BinaryNode create(int preL,int preR,int inL,int inR,int[] pre,int[] in){
        if(preL>preR){
            return null;
        }
        BinaryNode root=new BinaryNode();
        root.data=pre[preL];
        int k;
        for(k=inL;k<=inR;k++){
            if(in[k]==pre[preL]){
                break;
            }
        }//在中序遍历中获得根结点
        int numLeft=k-inL;
        root.lchild=create(preL+1,preL+numLeft,inL,k-1,pre,in);
        root.rchild=create(preL+numLeft+2,preR,k+1,inR,pre,in);
        return  root;
    }
人群仿真软件:Pathfinder_(14).与其他软件的集成与互操作 在人群仿真软件的二次开发中,与其他软件的集成和互操作是非常重要的。通过数据导入导出、接口调用和脚本编写,可以显著提升仿真的准确性和实用性。Pathfinder提供了多种数据格式的支持和丰富的API,使得与其他软件的集成变得简单高效。无论是建筑模型的导入、仿真结果的导出,还是实时数据的交换,Pathfinder都能满足用户的需求。 阅读详情

相关推荐

[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析

本文深入分析了RK3588平台上U-Boot的网络功能实现,主要内容包括: 网络架构:详细剖析了从硬件层到协议层的完整网络栈架构,包括GMAC驱动、TFTP/NFS启动、网络命令等关键组件。 驱动实现:重点介绍了RK3588 GMAC驱动结构,包含关键数据结构、专用操作函数集、设备树兼容性配置和GRF寄存器设置。 功能实现:详细说明了驱动初始化流程、RGMII速度适配机制以及PHY接口配置过程。 高级特性:涵盖了网络启动功能、镜像更新和MAC地址传递到Linux内核的机制。 文档通过代码片段和流程图清晰展示

Just Linux! 1113

算法刷题【洛谷P1185】绘制二叉树

题目描述 二叉树是一种基本的数据结构,它要么为空,要么由根节点,左子树和右子树组成,同时左子树和右子树也分别是二叉树。 当一颗二叉树高度为m-1m−1时,则共有mm层。除mm层外,其他各层的结点数都达到最大,且结点节点都在第mm层时,这就是一个满二叉树。 现在,需要你用程序来绘制一棵二叉树,它由一颗满二叉树去掉若干结点而成。对于一颗满二叉树,我们需要按照以下要求绘制: 1、结点用小写字母“o”表示,对于一个父亲结点,用“/”连接左子树,同样用“\”连接右子树。 2、定义[i,j[i,j]为位于第ii

异想之旅的博客 1541

踩坑记录:Clawdbot 对接 Minimax 报错 “401 token is unusable (1004)“ 的终极解决方案

如果你也在配置 Clawdbot 对接 Minimax 模型时,明明 API Key 是新申请的,却死活报错 `401 Unauthorized`,错误码 `1004`,提示 `token is unusable`——那么恭喜你,来对地方了。

hampeter的博客 2001

数据结构:链表二叉树

二叉树是一种数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的根节点是整个树的入口,通常我们可以通过递归的方式来访问树中的所有节点。二叉树在计算机科学中应用非常广泛,例如在表达式解析、搜索算法、排序等方面。在这篇文章中,我们将学习如何在C语言中实现一个简单的二叉树,并讲解其各个功能模块,包括如何创建节点、遍历树、计算节点数量、查找节点等。通过这篇博客,大家会掌握如何设计和实现二叉树,避免常见的错误,并理解这些操作背后的原理。这篇博客带领大家一步步实现了二叉树的基本操作。

m0_62048999的博客 1620

R语言孟德尔随机化环境搭建:手把手教你搞定gwasvcf、gwasglue等包的安装报错(附本地安装包)

本文详细介绍了R语言中孟德尔随机化环境搭建的全流程,重点解决gwasvcf、gwasglue等包的安装报错问题。从依赖关系解析到GitHub访问配置,再到离线安装方案,手把手教你搭建完整的分析环境,特别适合生物信息学新手快速上手。

weixin_29093017的博客 215

使用SSE流式输出(Javaweb前后端实战)

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

记得开心一点嘛的博客 1万+

数据结构(链表、二叉树、红黑树、多叉树、b-tree、b+tree)

链表--》二叉树--》多叉树--》二叉平衡树--》红黑树---》多路搜索树btree--》b+tree 根据子节点的个数可以划分成N叉树(一般N ≥ 2),N叉树拥有的特征是每个节点至多有N个子节点。 比如,N = 2时,称为二叉树,每个节点至多只有2个节点。 1、链表:当二叉树没有在分叉的时候就是链表(n=1) 2、二叉树(n=2) 3、当n=3的时候,n就是3叉树,n=n 的时候那就是n叉树,多叉树就是这样子 4、平衡二叉搜索树(红黑树) 平衡二叉搜索树,顾名思义,是二叉树同时满足

lq2418c的博客 1310

一。CST 电路 微带低通滤波器设计练习 I

CST 电路和系统软件功能还是比较强的,我们一起一步一步学习,一起进步。 这个例子出现在CST的电路和系统软件功能(Circuit Simulation & SAM (System Assembly and Modeling) )介绍资料中。本文是用CST2021建模操作仿真到,不同版本在视觉和结果上稍有不同。 利用电路模块可以很快很准确地建立3D微带平面电路,用于仿真滤波器、功分器、巴伦等等。

麦克斯韦信徒的博客 3235

树------二叉树

二叉树主要延续上一遍文章,详细讲述树的分类种第一个分类------二叉树。主要从基本概念、基本特点和几种二叉树的对比进行介绍什么是二叉树

小菜鸟 563

特征拼接(Feature Concatenation)技术全景解析

特征拼接是深度学习中的核心特征融合技术,通过在指定维度连接不同来源的特征张量,创造性地解决了多源、多尺度特征融合的关键挑战。这种简单却强大的操作已成为现代神经网络架构设计的基石。

浩瀚之水的专栏 1639

【视频监控国标GB/T28181】无人机的视频图传技术

然而,随着无人机市场的不断发展和无人机视频图传技术的迅速进步,一些厂家正积极探索更多的传输方式。如今,一些大疆无人机已经具备了4G辅助图传功能,这意味着它们需要在无人机上安装相应的SIM卡,并在有移动互联网信号的情况下,通过互联网进行视频图传。这种技术的应用,不仅提高了无人机的操作灵活性,也使得无人机在各个领域的应用更加广泛。在使用时,用户需时刻注意无人机的飞行距离。在无人机图传系统中,OFDM技术的运用更是如虎添翼,显著增强了视频传输的品质与稳定性,尤其在错综复杂的电磁环境中,更能凸显其不可替代的优势。

开源物联网项目商业化作者 5661

链表与二叉树

1、什么是链表? ​ 链表 [Linked List]:链表是由一组不必相连(不必相连:可以连续也可以不连续)的内 存结构(节点),按特定的顺序链接在一起的抽象数据类型。 补充: ​ 抽象数据类型(Abstract Data Type [ADT]):表示数学中抽象出来的一些操作的集合。 内存结构:内存中的结构,如:struct、特殊内存块…等等之类; 数组和链表的区别和优缺点: ​ 数组是一种连续存储线性结构,元素类型相同,大小相等 数组的优点: ​ 存取速度快 数组的缺点: ​ 事先必须知道数组的

qq_45173120的博客 648

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【数据结构】二叉树专题

前言本篇博客我们来看一些二叉树的经典题型,也是对上篇博客的补充若有问题 评论区见📝。

m0_74091744的博客 1505

NTscan扫描工具

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《代码随想录(Carl)》 数据结构与算法 二叉树专题大总结

把《代码随想录(Carl)》数据结构与算法 中二叉树专题的各分支每道题目的关键知识点做了注释!

u010894131的博客 352

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据结构与算法:二叉树专题

Python、数据结构与算法、栈、队列、二叉树、中序遍历、层次遍历

FriendshipTang的博客 893

数据结构 二叉树遍历专题

// 二叉树的数据结构 typedef struct BiTNode{ //二叉链表 char data; //默认char型,可替换 struct BiTNode *lchild,*rchild; }BiTNode, *BiTree; 1. 二叉树先序,中序,后续遍历递归算法。 //先序 void postorder(BiTree T) { if(T!=NULL) { visit(T); postorder(T-

qq_43128902的博客 360

Java数据结构初阶——二叉树专题

这篇文章带你先了解树形结构的特点,然后重点介绍最常用的二叉树,特别是完全二叉树。内容会讲到它们的核心概念、重要性质和一些基本操作,帮你打好这块的基础。

2502_91380778的博客 835

javascript 数据结构专题--二叉树概览

一 定义 树 树是用来模拟具有树状结构性质的数据集合,是n(n>=0)个结点的有限集,n=0时称为空树。在任意一颗非空树中: 1)"有且仅有"一个特定的称为根(Root)的结点; 2)当n>1时,其余结点可分为m(m>0)个"互不相交"的"有限集(数量没有限制)"T1、T2、…、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。 。 结点:包含一个数据元素及若干指向子树分支的信息,树最基本的数据结构单元。 节点的度:结点拥有的子树数目称为结点的度 叶子节点:终端结点,没有子树的结点或

LHDIYU的博客 360

【数据结构】二叉树专题总结

专题主要内容: 二叉树的概念 二叉树的性质 二叉树存储方式 二叉树基本操作 二叉树经典面试题 前言: 树的定义:树是一种数据结构,它是由n(n&amp;amp;amp;gt;=1)个有限结点组成一个具有层次关系的集合。 树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子...

码农印象 1280

【数据结构刷题专题】—— 二叉树

本文对二叉树专题做了详细讲解,(1)二叉树的遍历方式(2)二叉树的属性(3)二叉树的修改和构造(4)求二叉树的属性(5)二叉树公共祖先问题(6)二叉搜索树的修改和构造

BigDavid123的博客 1339

数据结构——二叉树堆的专题

如果有一个关键码的集合K = {K0 ,K1 ,K2 ,K3…) i = 0,1, 2…,则称为(或将。

imaima666的博客 951

数据结构与算法:二叉树专题练习解析

以上题目涵盖了二叉树的基本概念、性质及其应用。通过这些题目,可以加深对二叉树的理解和掌握,尤其是对于准备面试或考试的同学来说,是一个很好的复习材料。在学习数据结构时,完全二叉树是一个非常重要的概念,尤其在堆、优先队列等应用中频繁出现。今天我们就通过一道典型填空题,深入理解如何快速计算一棵完全二叉树的深度(或高度)。对于深度为hhh的满二叉树(每一层都填满),其结点总数为:n=2h−1 n=2^h-1 n=2h−1而完全二叉树的结点数nnn满足:2h−1≤n<2h 2^{h-1}\leq n<2^h 2h−1

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 816

数据结构10:二叉树专题

数据结构10:二叉树专题 二叉树实现插入节点、查找节点、删除节点、前序遍历、中序遍历、后序遍历。

qq_29606255的博客 334

数据结构进阶篇,二叉树构造专题

105. 从前序与中序遍历序列构造二叉树  「题目:」  给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。  「示例:」  输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7],输出: [3,9,2...

descire 545

《数据结构》专题4--二叉树

《数据结构》专题4--二叉树

qq_62268699的博客 470

数据结构(7)—二叉树_堆专题

堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。堆可以是二叉堆,也可以推广到 k 元堆,但最常见的是二叉堆。堆的特点是根节点的键值为最小(或最大)的,并且每个父节点的键值总是小于(或大于)其子节点的键值。这使得堆可以非常高效地用于提取最小(或最大)元素的操作。

weixin_54114700的博客 913
上一篇: 电商秒杀项目框架图
下一篇: 数据结构专题——二叉查找树的基本操作
thirty.st
博客等级 码龄7年 22粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值