二叉树遍历、查找和删除说明

二叉树(BST树)内结点的删除(3种情况全解) 现在有一棵二叉树查找树如下: 如果我们需要删除一个结点,而且在删除之后,依然满足二叉查找树的数据排序策略。此时删除操作可分为一下三种情况。如下情况1:结点没有左子树 如图:一棵没有左子树的二叉树 如果在此情况下删除结点,按照结点的位置又可以分为三种处理方式。如下 删除根结点:删除根结点也就是删除结点 5,此时只需将根结点指针指向其右子树结点。如下图 删除叶子结点:如果删除的结点是叶子结 阅读详情

1.二叉树的概念

(1)数有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。
(2)二叉树的子节点分为左节点和右节点
(3)示意图
在这里插入图片描述
(4)如果改二叉树的所有叶子节点都在最后一层,并且节点总数=2^n-1,n为层数,则我门称为满二叉树。
在这里插入图片描述
(5)如果改二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点再左边连续,倒数第二层的叶子节点再右边连续,我们称为完全二叉树。
在这里插入图片描述

2.二叉数遍历说明

(1)前序遍历:先输出父节点,再遍历左子树和右子树,总结起来就是根左右。
(2)中序遍历:先输出左子树,再输出父节点,再遍历右子树,总结起来左根右。
(3)后续遍历:先遍历左子树,再遍历右子树,最后输出父节点,总结起来左右根。

3.二叉树遍历应用实例

3.1思路分析
1.创建一颗二叉树
2.前序遍历
2.1先输出当前节点
2.2如果左节点不为空,则递归继续前序遍历
2.3如果右节点不为空,则递归继续前序遍历
3.中序遍历
3.1如果左节点不为空,则递归继续前序遍历
3.2再输出当前节点
3.3如果右节点不为空,则递归继续前序遍历
4.后序遍历
4.1如果左节点不为空,则递归继续前序遍历
4.2如果右节点不为空,则递归继续前序遍历
4.3.最后输出当前节点
3.2代码演示

public class BinaryTreeeDemo {
    public static void main(String[] args) {
        HeroNode heroNode1 = new HeroNode(1, "宋江");
        HeroNode heroNode2 = new HeroNode(2, "卢俊义");
        HeroNode heroNode3 = new HeroNode(3, "吴用");
        HeroNode heroNode4 = new HeroNode(4, "林冲");
        BinaryTree tree = new BinaryTree();
        heroNode1.setLeft(heroNode2);
        heroNode1.setRight(heroNode3);
        heroNode2.setLeft(heroNode4);
        tree.setRoot(heroNode1);
        /*
         *二叉树
         *      1
         *    2   3
         *  4
         */
        //tree.preOrder();//1243
        //tree.infixOrder();//4213
        tree.postOrder();//4231
    }
}
//二叉树
class BinaryTree{
    //根节点
    private HeroNode root;

    public HeroNode getRoot() {
        return root;
    }

    public void setRoot(HeroNode root) {
        this.root = root;
    }
    //前序遍历
    public void preOrder() {
        if (this.root != null){
            this.root.preOrder();
        }
    }
    //中序遍历
    public void infixOrder() {
        if (this.root != null){
            this.root.infixOrder();
        }
    }
    //后序遍历
    public void postOrder() {
        if (this.root != null){
            this.root.postOrder();
        }
    }
}
//定义HeroNode,每个HeroNode对象就是一个节点
class HeroNode {
    private Integer no;
    private String name;
    private HeroNode left;//左指针
    private HeroNode right;//右指针
    public HeroNode() {
    }

    public HeroNode(Integer no, String name) {
        this.no = no;
        this.name = name;

    }

    public Integer getNo() {
        return no;
    }

    public void setNo(Integer no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public HeroNode getLeft() {
        return left;
    }

    public void setLeft(HeroNode left) {
        this.left = left;
    }

    public HeroNode getRight() {
        return right;
    }

    public void setRight(HeroNode right) {
        this.right = right;
    }
    //前序遍历
    public void preOrder() {
        //先输出跟节点
        System.out.println(this);
        //再输出左节点
        if (this.left != null){
            this.left.preOrder();
        }
        //最后输出右节点
        if (this.right != null) {
            this.right.preOrder();
        }
    }
    //中序遍历
    public void infixOrder() {
        //先输出左节点
        if (this.left != null){
            this.left.infixOrder();
        }
        //然后输出跟节点
        System.out.println(this);
        //最后输出右节点
        if (this.right != null) {
            this.right.infixOrder();
        }
    }
    //后序遍历
    public void postOrder() {
        //先输出左节点
        if (this.left != null){
            this.left.postOrder();
        }
        //然后输出右节点
        if (this.right != null) {
            this.right.postOrder();
        }
        //最后输出跟节点
        System.out.println(this);

    }
    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name=" + name +
                "}";
    }
}

4.二叉树查找应用实例

4.1思路分析
前序查找
(1)先判断当前节点是否是要查找的节点,如果是则返回当前节点
(2)如果不等,判断当前节点的左节点是否不为空,如果不为空再左子树上递归前序查找
(3)如果再左子树上找到目标节点,则直接返回该节点,否则继续在右子树上进行递归前序查找,不管找没找到都直接返回。
中序查找
(1)判断当前节点的左节点是否不为空,如果不为空再左子树上递归中序查找
(2)如果再左子树上找到目标节点,则直接返回该节点
(3)不然判断当前节点是否是是要查找的节点,如果是则返回当前节点
(4)如果不是,判断当前节点的右节点是否不为空,如果不为空再右子树上递归中序查找,不管找没找到都直接返回
后序查找
(1)判断当前节点的左节点是否不为空,如果不为空再左子树上递归中序查找
(2)如果再左子树上找到目标节点,则直接返回该节点,否则继续在右子树上进行递归后序查找
(3)随后判断当前节点是否是目标节点,如果是直接返回
(4)最后,不管找没找到都直接返回
4.2代码实现

//前序遍历查找
public void preOrderSearch(int no) {
    if (this.root != null){
        System.out.println("通过英雄排名找到了英雄:"+this.root.preOrderSearch(no));
    }
}
//中序遍历查找
public void infixOrderSearch(int no) {
    if (this.root != null){
        System.out.println("通过英雄排名找到了英雄:"+this.root.infixOrderSearch(no));
    }
}
//后序遍历查找
public void postOrderSearch(int no) {
    if (this.root != null){
        System.out.println("通过英雄排名找到了英雄:"+this.root.postOrderSearch(no));
    }
}

//前序遍历查找
public HeroNode preOrderSearch(int no) {
    if (this.no == no) {
        return this;
    }
    HeroNode result = null;
    //先在左子树上查找
    if (this.left != null){
        result = this.left.preOrderSearch(no);
    }
    //如果result不为null,那么说明找到了,就不用查找右子树了
    if (result != null) {
        return result;
    }
    //再在右子树上查找
    if (this.right != null) {
        result = this.right.preOrderSearch(no);
    }
    return result;
}

//中序遍历查找
public HeroNode infixOrderSearch(int no) {
    HeroNode result = null;
    if (this.left != null){
        result = left.infixOrderSearch(no);
    }
    if (result != null) {
        return result;
    }
    if (this.no == no) {
        return this;
    }
    if (this.right != null) {
        result = right.infixOrderSearch(no);
    }
    return result;
}
//后序遍历查找
public HeroNode postOrderSearch(int no) {
    HeroNode result = null;
    if (this.left != null){
        result = left.postOrderSearch(no);
    }
    if (result != null) {
        return result;
    }
    if (this.right != null) {
        result = right.postOrderSearch(no);
    }
    if (this.no == no) {
        return this;
    }
    return result;
}

5.二叉树删除应用实例

5.1思路分析
规定:
(1)如果删除的节点时叶子节点,则删除改节点
(2)如果删除的节点时非叶子节点,则删除改子树
思路:
(1)如果树是空树,则抛出空指针异常,如果根节点就是目标节点就把根节点置空
(2)因为本次二叉树是单向的,所有我们是判断当前节点的子节点是否是要删除的节点,而不能取判断当前这个节点是不是要删除的节点
(3)如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,就将this.left=null,并且就返回删除节点的编号
(4)如果当前节点的右子节点不为空,并且右子节点就是要删除的节点,就将this.right=null,并且就返回删除节点的编号
(5)如果第3和第4步没有删除节点,那么我们就要向左子树进行递归删除
(6)如果第5步也没有删除节点,则向右子树进行递归删除
5.2代码实现

public void deleteNode(int no) {
    if (root == null) {
        throw new NullPointerException("根节点为空");
    }
    if (this.root.getNo() == no){
        this.root = null;
        System.out.println("删除节点成功:"+this.root.getNo());
        return;
    }
    System.out.println("删除节点成功:"+this.root.deleteNode(no));
}
//删除节点,返回删除节点的编号
public int deleteNode(int no) {
    //不能直接删除当前节点,要删除当前节点的子节点,因为这是一个单向树,删除当前节点时并不能删除父节点对当前节点的依赖
    //删除当前节点左子节点
    if (this.left != null && this.left.no == no) {
        this.left = null;
        return no;
    }
    //删除当前节点右子节点
    if (this.right != null && this.right.no == no) {
        this.right = null;
        return no;
    }
    int result = -1;
    //在左子树上递归删除节点
    if (this.left != null) {
        result = this.left.deleteNode(no);
    }
    //如果result不等于-1就说明删除目标节点了,就不需要遍历右子树了
    if (result != -1) {
        return result;
    }
    //在右子树上递归删除节点
    if (this.right != null) {
        result = this.right.deleteNode(no);
    }
    return result;
}
【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归) 本代码是在windows平台下vs2008上编译通过,包含搜索二叉树的插入,查找和删除算法(采用递归和非递归两种方法)。包含全部在平台下的文件,解压可以直接运行。 立即下载

相关推荐

使用DDR4控制器实现多通道数据读写

这种高带宽对于大量的数据的应用非常重要。对于Controller/PHY Mode 的选择,我们使用Controller + PHY模式,Xilinx UltraScale/UltraScale+等高端FPGA通常包含硬核PHY,选择Controller + PHY模式可直接利用硬核,降低功耗和延迟,并且此模式的开发更易上手。在Basic页面下,首先勾选上AXI4 Interface选项,我们选用的内存接口速度为2133MHz的ddr4芯片,由于双沿触发,频率为1066MHz,那么周期应为938ps。

weixin_38828382的博客 1364

二叉搜索树 的查找插入和删除

#include<iostream> using namespace std; const int length = 10; typedef struct TreeNode { int data; struct TreeNode*left; struct TreeNode*right; } *BinTree; void InsertSearchNode...

海里波特博客 236

STM32_WS2811驱动

STM32的WS2811驱动

健身房 2842

数据结构之----二叉树、二叉树遍历、二叉树数组表示、二叉搜索树

层序遍历是从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。层序遍历本质上属于广度优先遍历,它体现了一种一圈一圈向外扩展的逐层遍历方式。前序、中序和后序遍历都属于深度优先遍历,它体现了一种“先走到尽头,再回溯继续”的遍历方式。下图展示了对二叉树进行深度优先遍历的工作原理。深度优先遍历就像是绕着整个二叉树的外围“走”一圈,在每个节点都会遇到三个位置,分别对应前序遍历、中序遍历和后序遍历。二叉树是一种非线性数据结构,体现“一分为二”的分治逻辑。

weixin_43285931的博客 2008

ESP32-S3双模CMSIS-DAP调试器:USB+WiFi无线调试方案

CMSIS-DAP是ARM生态中标准化的嵌入式调试协议接口,广泛用于Keil、IAR、STM32CubeIDE等开发环境。其核心原理是通过SWD/JTAG物理层实现目标芯片寄存器访问、内存读写与断点控制,依赖确定性时序和低延迟通信。传统DAPLink调试器受限于USB线缆束缚,而WiFi-USB-DAPLink项目将完整CMSIS-DAP v2协议栈移植至ESP32-S3平台,同时支持USB CDC直连与WiFi TCP远程通道,兼顾实时性与网络化部署能力。该方案无需主机驱动、兼容主流IDE,并支持多机并发

weixin_31185473的博客 371

向量乘法器设计

同样基于Wallace树乘法器,我们来构造向量乘法器。 在一些矩阵运算中经常用到向量的相乘运算,本例以4维向量为例子介绍向量乘法器的verilog HDL设计。 设向量a = (a1, a2, a3, a4), b = (b1, b2, b3, b4)。 则a 与 b的点乘为:a * b = a1 b1 + a2 b2 + a3 b3 + a4 b4, 即向量对应位置的值相乘,再相加...

Reborn Lee 2969

数据结构---二叉树(遍历查找)

数据结构-树遍历

qq_45115146的博客 608

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

一、本文介绍 本文记录的是基于 GhostNetV3 的 YOLOv11 轻量化改进方法研究。GhostNetV3的轻量模块采用重参数化方法,训练时为深度可分离卷积和1×1卷积添加线性并行分支,推理时通过逆重参数化移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现YOLOv11的轻量化改进。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进 专栏地址:YOLOv11改进专栏——以发表论文的角度,快速

Limiiiing的博客 1845

二叉树的遍历与查找(详细笔记)

博客主页小吴_小吴有想法_优快云博客-leetcode,笔记,java领域博主 欢迎关注点赞收藏和留言 天道酬勤,勤能补拙,和小吴一起加油吧 17岁大一新生,水平有限,恳请各位大佬指点,不胜感激! 参考书籍:《算法4》,学习视频:尚硅谷Java数据结构与java算法(Java数据结构与算法)_哔哩哔哩_bilibili 目录 为什么有二叉树 二叉树的遍历 代码实现 二叉树——查找指定结点 前序查找思路 中序查找思路 后序查找思...

小吴 3467

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2729

matlab 点云泊松盘采样

本文介绍了泊松盘采样算法在三维点云处理中的应用。该算法通过最小间距约束(任意两点距离≥r)和均匀分布特性,生成高质量、均匀分布的点集。文章详细阐述了参数设置(如采样半径、候选点数),并与体素栅格、随机采样等方法进行了对比。代码实现部分展示了MATLAB版本的泊松盘采样算法,包括KD树加速和候选点生成机制。实验结果表明,该方法能有效保持点云特征,适用于点云简化、曲面重建等场景。文中还提供了参数调整建议和不同应用场景下的使用指导。

点云侠的博客 537

二叉树(前中后序遍历,查找,删除)

二叉树的遍历   1. 前中后序遍历    二叉树的前序遍历(根节点最先遍历):    中序遍历    二叉树的后续遍历:    小结:   2.二叉树的前中后续查找:    2.1二叉树的前序查找:    2.2二叉树的中序查找:    2.2二叉树的后续查找:   3 二叉树节点删除操作:   完成删除结点的操作   思路   步骤:

2301_80062351的博客 1911

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

算法如诗的博客 258

二叉树的概念以及二叉树的分类,添加,删除

后序遍历:从根结点出发,则第一次到达结点A,不输出A,继续向左访问,第一次访问结点B,不输出B;到达H,H左子树为空,则返回到H,此时第二次访问H,不输出H;当到达叶子结点H,返回到D,此时已经是第二次到达D,故不输出D,进而向D右子树访问,D右子树不为空,则访问至I,第一次到达I,则输出I;I为叶子结点,则返回到D,D左右子树已经访问完毕,则返回到B,进而到B子树,第一次到达E,故输出E;中序遍历:从根结点出发,则第一次到达结点A,不输出A,继续向左访问,第一次访问结点B,BU不输出B;

2501_90124553的博客 1171

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

二叉树-前序中序后续遍历,以及查找删除操作!

一、二叉树的介绍 1.二叉树:每个节点最多只能有两个子节点的一种形式的树 2.左右节点:也叫孩子节点,二叉树的子节点分为左节点和右节点,如图21为11的左子节点,31为11的右子节点,11为21和31的父节点 3.叶子节点:叶子节点就是树中最底段的节点,叶子节点没有子节点。 4.满二叉树:二叉树的所有叶子节点都在最后一层,并且满足节点总数为2^(n-1),n为层数。 5.完全二叉树:二叉树的所有叶子节点都在最后一层或者分布在倒数第二层,并且满足最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连

Passer-Go 370

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

二叉树查找、插入、遍历、删除节点

1、二叉树节点的类: package Tree; // 二叉树节点 public class Node { // 数据项 public int data; // 左子节点 public Node leftChild; // 右子节点 public Node rightChild; // 构造方法 public Node(int data) { this.data = dat...

wxx17353227396的博客 534

IEM模型,地表粗糙度模拟

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

js遍历树节点下的所有子节点_javascript实现二叉树,前序中序后续遍历和查找

二叉树 为什么需要树这种数据结构1.数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]2.链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。 缺点:在进行检索时,效率仍然较低...

weixin_39826971的博客 1119

(八)树—二叉树的遍历查找删除

二叉树的遍历

Mr_John 208

二叉树的前序遍历、中序遍历、后序遍历

1、数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 2、链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)3、树存储方式的分析 能提高数据存储,读取的效率, 比如利用 二叉排序树(Binary Sort Tree),

m0_45364328的博客 1186

使用链表实现二叉树的前中后序遍历、检索与删除

使用链表实现二叉树的前中后序遍历、检索与删除

weixin_44885503的博客 351

二叉树实现(C语言)

二叉树是一种非常重要的数据结构,它在计算机科学中有着广泛的应用。

qq_40844444的博客 490

【Java数据结构与算法】第十章 哈希表和二叉树

建立一个循环队列,先将二叉树根结点入队列,然后出队列,访问根结点,如果它有左子树,则将左子树的根结点入队:如果它有右子树,则将右子树的根结点入队。如果把一棵非空的树的根结点删除,则该树就变成了一片森林,森林中的树由原来根结点的各棵子树构成。结点的层次:从根结点开始,假设根结点为第 1 层,根结点的子结点为第 2 层,依此类推,如果某一个结点位于第 L 层,则其子结点位于 L + 1 层。如果当前结点的右子结点不为空,并且左子结点就是要删除的结点,执行 this.right = null,并 return。

2401_83916030的博客 820

咬文嚼图式的介绍二叉树、B树/B-树

前言 因为本人天资愚钝,所以总喜欢将抽象化的事务具象化表达。对于各类眼花缭乱的树,只需要认知到它们只是一种数据结构,类似数组,切片,列表,映射等这些耳熟能详的词汇。对于一个数据结构而言,无非就是增删改查而已,既然各类树也是数据结构,它们就不能逃离增删改查的桎梏。 那么,为什么我们需要树这种数据结构呢,直接用数组不行吗,用切片不行吗?当然可以,只不过现实世界是缤纷杂乱的,而又没有一种万能药式的数据...

weixin_30277297的博客 186

数据结构:二叉树

树中的数据元素之间的逻辑关系是一对多的。,双分支结点指的是就是度为2的结点,假设二叉树的叶子结点数量为n0,二叉树中单分支结点的数量为n1,二叉树中双分支结点的数量为n2,则二叉树中结点的总数 = n0 + n1 + n2。可以看到,上图二叉查找树中叶子结点的数量为3,度为1的结点的数量为1,度为2的结点数量为2,所以该二叉查找树的结点总数为6,和图中结点数量一致。可以看到,结点A有2个子结点,分别是B和H,所以子树B和子树H的双亲就是结点A,同理,结点B和H就是结点A的孩子,并且结点B和H是兄弟。

qq_55948464的博客 839

启迪思维:二叉树

很多初级点的程序员会认为树结构无用论,也有初级程序员仅仅以为只有面试才会用到,还有自认为实际工作用不到(我身边工作好几年程序员懂树结构也没有几个),其实归根到底还是不清楚树的实际用途,下面分享我参加培训时候一个小尴尬。 因为项目数据量很大(有很多表数据量都上亿的),对写sql能力要求很高,项目组会经常组织些数据库方面的培训,前段时间又参加公司一个SQL原理分析的一个培训,在培...

dgqb1999的博客 304

java二叉树删除算法_[Java教程]二叉树附加删除算法_星空网

二叉树附加删除算法2014-05-070public class Tree { TreeNode last = null; TreeNode root = null; public Tree(int value){ root = createNode(value); } //结构 static class TreeNode{ int data; ...

weixin_39929793的博客 74
上一篇: 查找算法
下一篇: 选择排序之堆排序
suixinghero
博客等级 码龄7年 10粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值