## java实现的二叉树 ##

Gemini永久会员 使用Java实现二叉树序列化和反序列化的代码,包括前序遍历(递归)和层次遍历(BFS)两种方法 System.out.println("BFS反序列化后的根节点值: " + deserializedBFS.val);System.out.println("递归反序列化后的根节点值: " + deserialized.val);- **空间复杂度**:O(n),在最坏情况下,队列中会存储所有叶子节点,对于完全二叉树,叶子节点数为 n/2。以下是使用Java实现二叉树序列化和反序列化的代码,包括前序遍历(递归)和层次遍历(BFS)两种方法。- **时间复杂度**:O(n),其中 n 是树中的节点数。 阅读详情

使用非递归方式实现了二叉树的先序、中序、后序遍历

/**
 * 二叉树操作,包括: 
 * 构造二叉树; 
 * 先序遍历,中序遍历,后序遍历
 * 
 * @author cxp
 * @data 2016-9-19
 * @modify
 */
public class BinaryTree {
    /**
     * 利用数组构造二叉树
     * 
     * @return
     */
    public TreeNode createBinaryTree() {
        System.out.print("将使用下面的数字构建满二叉树:");
        int[] values = { 5, 3, 7, 2, 4, 6, 8, 1 };
        for (int i : values) {
            System.out.print(i + " ");
        }
        System.out.println();
        System.out.println("-----------------------------------");
        boolean isLeft = true;// 判断左节点是否已被赋值
        int len = values.length;// 获取数组的长度
        if (len == 0)
            return null;
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        TreeNode root = new TreeNode(values[0]);// 创建根结点
        queue.addLast(root);// 将根结点添加到队列末尾
        TreeNode parent = null;
        TreeNode current = null;
        for (int i = 1; i < len; i++) {
            current = new TreeNode(values[i]);
            queue.addLast(current);// 将当前结点添加到队列末尾
            if (isLeft)
                parent = queue.getFirst();// 获取队列头的值
            else
                parent = queue.removeFirst();// 移除队列头的值
            if (isLeft) {
                parent.left = current;
                isLeft = false;
            } else {
                parent.right = current;
                isLeft = true;
            }
        }
        return root;// 返回二叉树的根结点
    }

    /**
     * 二叉树的先序遍历(非递归) 
     * 利用栈(后进先出)实现二叉树的先序遍历
     * 压栈的时候访问结点值
     * @param root
     * @return
     */
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> nodeList = new ArrayList<Integer>();// 返回的先序遍历的结点列表
        LinkedList<TreeNode> stack = new LinkedList<TreeNode>();// 链表实现的栈
        if (root == null)// 根结点为空,直接返回
            return nodeList;
        TreeNode current = null;
        stack.push(root);// 压入根结点
        while (!stack.isEmpty()) {// 栈不为空时循环
            current = stack.pop();// 当前结点出栈
            nodeList.add(current.val);// 访问父结点
            if (current.right != null)// 将当前结点的右子节点入栈
                stack.push(current.right);
            if (current.left != null)// 将当前结点的左子节点入栈
                stack.push(current.left);
        }
        return nodeList;
    }

    /**
     * 二叉树的中序遍历(非递归) 
     * 利用栈(后进先出)实现二叉树的中序遍历
     * 出栈的时候访问结点值
     * @param root
     * @return
     */
    public List<Integer> inorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack = new LinkedList<TreeNode>();// 用链表实现栈
        List<Integer> nodeList = new ArrayList<Integer>();// 存储返回值的结点列表
        TreeNode current = root;
        while (current != null || !stack.isEmpty()) {
            // 循环压入左结点
            while (current != null) {
                stack.push(current);// 将当前结点压入栈中
                current = current.left;//访问左结点
            }

            current = stack.pop();// 结点出栈
            nodeList.add(current.val);// 访问结点值
            current = current.right;// 访问右结点

        }
        return nodeList;
    }

    /**
     * 二叉树的后序遍历(非递归)
     * 总体思路是先将右边的值添加到结点列表(nodeList)中,再将左边的值添加进去(添加在列表头部)
     * 压栈的时候访问结点值
     * @param root
     * @return
     */
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList<Integer> nodeList = new LinkedList<Integer>();// 返回的结点列表
        LinkedList<TreeNode> stack = new LinkedList<TreeNode>();// 链表实现栈
        if (root == null)
            return nodeList;
        TreeNode current = root;//根结点赋给当前访问结点
        while (current != null || !stack.isEmpty()) {
            if (current != null) {
                stack.push(current);//将当前结点压入栈
                nodeList.addFirst(current.val);//将结点值添加到结点列表的首部
                current = current.right;//访问右结点,使右结点先入栈
            } else {
                TreeNode node = stack.pop();//出栈
                current = node.left;//访问左结点
            }

        }
        return nodeList;
    }

    /**
     * 测试
     * 
     * @param args
     */
    public static void main(String[] args) {
        // 创建二叉树类
        BinaryTree binaryTree = new BinaryTree();
        // 构造一个二叉树
        TreeNode root = binaryTree.createBinaryTree();
        // 先序遍历
        System.out.println("先序遍历二叉树:");
        System.out.println(binaryTree.preorderTraversal(root));
        // 中序遍历
        System.out.println("中序遍历二叉树:");
        System.out.println(binaryTree.inorderTraversal(root));
        // 后序遍历
        System.out.println("后序遍历二叉树:");
        System.out.println(binaryTree.postorderTraversal(root));

    }

}
基于YOLOv8深度学习的夜视行人检测系统:UI界面 + YOLOv8 + 数据集的实现 为了解决这一问题,基于深度学习的行人检测技术,尤其是YOLO(You Only Look Once)系列算法,成为了一个有效的解决方案。本文将详细介绍如何构建一个夜视行人检测系统,利用YOLOv8模型实现高效的行人检测,并设计用户友好的界面以便于使用。本博客详细介绍了如何构建一个基于深度学习的夜视行人检测系统,包括数据准备、YOLOv8模型训练、用户界面设计和实时监控模块的实现。为了将数据集转换为YOLO格式,我们需要确保每个图像文件都有一个对应的标签文件,标签文件中包含行人的边界框信息。 阅读详情

相关推荐

求助:有没有基于pscad的锂电池仿真模型

求助:有没有基于pscad的锂电池仿真模型 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变没有 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写...

qq_38922523的博客 1222

面试中的二叉树问题总结【Java版】

package Algorithms.tree; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Stack; /** * REFS: *

yangcs2009的专栏 5470

THUCNews新闻文本分类-tfidf+sklearn

本文使用的是和鲸社区现有数据集,代码也在和鲸社区公开,fork之后可以直接运行。 本文中所用的数据集清华NLP组提供的THUCNews新闻文本分类数据集的一个子集(原始的数据集大约74万篇文档,训练起来需要花较长的时间)。 本次训练使用了其中的体育, 财经, 房产, 家居, 教育, 科技, 时尚, 时政, 游戏, 娱乐10个分类,每个分类6500条,总共65000条新闻数据。项目在和鲸社区的平台上跑的,数据集直接引用了和鲸的数据集,每个分类6500条,总共65000条新闻数据。 数据集划分如下: cnews

wmq104的博客 4591

java层序创建二叉树,Java 层序创建和遍历二叉树

##直接上代码package te.com;import java.util.LinkedList;import java.util.Queue;import java.util.logging.Level;class BinNode{Integer val;BinNode leftNode;BinNode rightNode;public BinNode(Integer val) {this.v...

weixin_34010461的博客 394

CST与MATLAB连接设置

打开MATLAB,点击"Set Path"按钮,然后点击"Add Folder"。在CST中,点击"Options"菜单,然后选择"Advanced"选项。在弹出的对话框中,点击"COMSOL"选项卡,并确保"Enable COMSOL"复选框被选中。通过上述步骤和示例代码,你可以开始使用MATLAB与CST进行集成,并根据你的具体需求进行进一步的开发和应用。通过这个简单的示例,你可以开始在MATLAB中与CST进行交互,并根据你的需求进行更复杂的操作,如参数化仿真、优化和数据处理等。

TechPulseZ的博客 1966

基于深度学习的工业零件缺陷检测系统

工业零件缺陷检测系统摘要 本文介绍了一个基于深度学习的工业零件缺陷检测系统解决方案。该系统采用Faster R-CNN目标检测算法,结合PyTorch框架和OpenCV图像处理库,实现了对工业零件表面缺陷(如裂纹、划痕、凹坑等)的自动检测与定位。系统包含完整的开发流程:从数据采集与标注、数据增强预处理、模型构建与训练,到最终的评估与部署。相比传统机器视觉方法,该深度学习方案具有更强的特征表示能力和环境适应性,能够有效提升工业质检的准确率和效率。文章详细阐述了系统架构设计、实现细节和优化策略,并提供了完整的代

huanghm88的专栏 286

java算法 二叉树 堆 队列

由于 `levelDeque` 是 `LinkedList<Integer>` 类型,而 `LinkedList` 实现了 `List<Integer>` 接口,因此可以直接添加。> - 父节点与子节点关系:`parent = (child - 1) / 2`,`left = 2*parent + 1`,`right = 2*parent + 2`> 这种实现方式在处理双端队列操作时具有高效性,所有基本操作均为 O (1) 时间复杂度,同时通过哨兵节点简化了边界条件的处理,使代码更加简洁可靠。

King_model的博客 641

Open3D KD-tree的使用【2025最新版】

Open3d使用FLANN构建KDTree以便进行快速最近邻检索。博客长期更新,本文最近一次更新时间为:2025年1月1日,代码已同步更新至Open3D 0.18.0版本。

点云侠的博客 40万+

Java数据结构——二叉树的遍历

首先,什么是二叉树的遍历呢? 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。 为什么要遍历二叉树呢? 因为计算机只会处理线性序列,而我们研究遍历,就是把树中的结点变成某种意义的线性序列,这给程序的实现带来了好处。 在遍历二叉树之前,我们首先要创建一个二叉树,想要创建如下图的二叉树,就要先进行二叉树的扩展,也就是将二叉树...

Racheil的博客 452

GVINS数据采集(u-blox fp9 + D435i)

1、配置千寻的RTK账号 采集数据当天购买千寻的RTK账号,然后在Window下,输入账号和密码 (具体的步骤如之前面连接所示),查看u-center软件上的信息,确保接收机可以收到RTK信息; 2、查看Linux系统下u-blox是否可以正常接受GPS信号和RTK数据流 1、GPS信号信息 // 打开端口 1 cd ublox_f9p/src // 或者在终端1下也可以 source devel/setup.bash r.....................

努力努力努力 2609

NX二次开发 内部函数鼠标动态位置获取

内部函数鼠标动态位置获取

qq285503851的博客 3336

【Java数据结构】二叉树进阶——非递归实现前中后序遍历二叉树(深入理解二叉树(1)

/如果q或者p就是根节点,那直接返回,此时他们就是最近公共祖先。//第一个根节点如果空的话,就直接返回了。//设置临时节点cur,通过这个节点来遍历整棵树。public TreeNode(char value){//构造函数,用于给节点赋值。//因为是中序遍历,所以先递归左节点。//pre走到当前节点,也就是当前节点成为下一个节点的前驱节点。//当前节点的左指针指向前驱节点。//前驱节点右指针指向当前节点。=null){//如果前驱节点非空。

2401_84139924的博客 833

合肥工业大学嵌入式系统原理实验报告

GPKDAT 的6、7引脚设置低电平,设置GPKDAT = 0x30则34灯亮12灯灭,GPKDAT 的4、5、6、7引脚全为高电平,设置GPKDAT = 0xf0,则led灯全灭。注意在烧写时要连接主机后面的USB接口,烧写完成后,要关闭开发板电源,将S2拨动开关置于NAND位置,然后重新开启开发板电源, 则开发板运行刚刚烧入的裸机程序。实验修改要求:在延时不变的条件下,将原程序中四个LED全亮,然后全灭的显示状态,修改为“四个全亮,然后1和2亮(3和4灭),然后3和4亮(1和2灭),最后全灭”。

Martin-share的博客 3098

二叉树的实现-java

节点的数据结构类 public class Node { public int data; public Node left; public Node right; } 创建二叉树 /** * 创建根节点 * @return */ public static Node createRoot() { ...

qq_37861955的博客 212

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

牛客题解 | 二叉树的前序遍历

牛客题库题解牛客题库题解

wc529065的博客 1045

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据结构:深入理解二叉树

欢迎回到小楊的频道,这篇博客我将为大家讲解JAVA数据结构中的二叉树结构,看完后相信你会有所收获。

Y20051106的博客 899

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

判断一棵二叉树是否为另一棵二叉树的子结构(JAVA版本)

分析:判断root1是否为root2的子树?首先,必须先找到树1中与树2的根节点相同的节点,然后判断从该节点开始root1中是否root2的结构;若有,则返回true,若没有,则返回false?答案是No! 因为二叉树root1中可能含有值相同的节点,所以,如果没有找到,就需要继续遍历root1. Way: 先设计一个函数,isSame(root1,root2)判断给定相同根节点的两子树是否一样

QiuYang18的博客 878

层次遍历构造二叉树 java

层次遍历构造二叉树给定层次遍历的数组顺序,注意是完全二叉树形态的数组,空节点用 # 号代替。代码如下:// ----- import java.util.Scanner;class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }c

YYYYBlueSky的专栏 3024

C++使用STL实现二叉树 前、中、后序遍历(非递归)

最近刚学到数据结构的二叉树部分,想用C++实现二叉树的前序、中序、后序遍历 一般二叉树的遍历有两种方法,递归和非递归,递归这里就不说了,网上各个版本都差不多,非递归一般是用栈来实现的,这里主要说一下非递归。 先简单说明一下这 3 种遍历方式有什么不同 —— 对于每种遍历,树中每个结点都需要经过 3 次(对于叶结点,其左右子树视为空子树),但前序遍历在第一次遇到结点时就立即访问,中序遍历是在第二次遇到结点时访问,后序遍历则是第三次访问。 所谓的前序、中序、后序都是以根节点为标准,前序就是先遍历根节点,中序就是

weixin_44161513的博客 1473

二叉树的创建

记录下几种创建二叉树的方法,仅java实现。 包括递归创建和非递归创建两种方法

ld的专栏 670

avl二叉树 java_平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现

平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现标签:#二叉树##数据结构##自平衡二叉树#时间:2018/10/27 09:30:01作者:小木[toc]#### 一、AVL树简介在前面的内容中,我们已经介绍了[平衡二叉树](https://www.datalearner.com/blog/1051540458496514)。其中提到了AVL...

weixin_36445525的博客 377

PTA部分编程题答案——二叉树

二叉树的层次遍历 编写程序,要求实现(1)按先序遍历序列建立二叉树的二叉链表;(2)按层次遍历二叉树。 构成二叉链表的结点类代码如下: class BtNode{ char data; BtNode lchild,rchild; } 按加入空树信息的先序遍历序列建立二叉树的二叉链表代码提供如下: //先序遍历序列建立二叉链表 public static BtNode createBiTree() ...

Lyn4444的博客 5699

剑指offer之序列化二叉树(Java实现)

序列化二叉树 NowCoder 题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 解题思路: 根据前序遍历规则完成序列化与反序列化。null序列化为‘##’。 1.序列化是指通过前序遍历把二叉树变成数组 2.反序列化是指重建二叉树 public class Solution { public int index = -1; String Serialize(TreeNo...

曾经 930

二叉树的遍历(java版)

节点的定义: Class BinaryTreeNode{ BinaryTreeNode leftchild; BinaryTreeNode rightchild; int val; BinaryTreeNode(int newval){ leftchild=null; rightchild=null; val=newval; } ##...

梧秋的博客 237

赫夫曼树原理以及java实现

赫夫曼树原理以及java实现 ##1.最优二叉树(赫夫曼树) ###在学习赫夫曼树之前,我们了解一下路径与路径长度的概念 ###1.1:路径:从树的一个结点到另一个结点之间的分支构成这两个节点之间的路径 ###1.2:路径长度:路径上的分支数目称作路径长度 ###1.3:树的路径长度:是从树根到每一结点的路径长度之和 ###1.4:结点的权:赋予结点上的一个有意义的实数 ###1.5:结点的带权路...

m0_45097637的博客 294

先序遍历构建二叉树 java

先序遍历构建二叉树注意这里的先序数组,空节点需要用 # 号代替,例如:124##56###3class PreOrder { public static String datas; public static int count = 0; //////// node 类 static class Node { private Node left = null; privat

YYYYBlueSky的专栏 1231
上一篇: qt问题1>c1xx : fatal error C1083: 无法打开源文件
下一篇: 生产者-消费者与队列的简单示例
github_32658299
博客等级 码龄11年 21粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值