二分搜索树层序遍历(Java 实例代码)

news2025/1/16 8:20:43

目录

 

二分搜索树层序遍历

Java 实例代码

src/runoob/binary/LevelTraverse.java 文件代码:


 

二分搜索树层序遍历

二分搜索树的层序遍历,即逐层进行遍历,即将每层的节点存在队列当中,然后进行出队(取出节点)和入队(存入下一层的节点)的操作,以此达到遍历的目的。

通过引入一个队列来支撑层序遍历:

  • 如果根节点为空,无可遍历;

  • 如果根节点不为空:

    • 先将根节点入队;

    • 只要队列不为空:

      • 出队队首节点,并遍历;
      • 如果队首节点有左孩子,将左孩子入队;
      • 如果队首节点有右孩子,将右孩子入队;

下面依次演示如下步骤:

(1)先取出根节点放入队列

 

b27d0af6b41aa66620c87c87d367e83c.png

(2)取出 29,左右孩子节点入队

 

501895dc00e739688c8b47a1e2ad073e.png

(3)队首 17 出队,孩子节点 14、23 入队。

 

0c7980faf4e56eb9244063c3083f6bf2.png

(4)31 出队,孩子节点 30 和 43 入队

 

64ce2eee3ebd6cc37cf4cd098997e1ce.png

(5)最后全部出队

 

0b184bd758bcec87c17e22b56154f8d3.png

核心代码示例:

...
// 二分搜索树的层序遍历
public void levelOrder(){

    // 我们使用LinkedList来作为我们的队列
    LinkedList<Node> q = new LinkedList<Node>();
    q.add(root);
    while( !q.isEmpty() ){

        Node node = q.remove();

        System.out.println(node.key);

        if( node.left != null )
            q.add( node.left );
        if( node.right != null )
            q.add( node.right );
    }
}
...

Java 实例代码

源码包下载:Download

src/runoob/binary/LevelTraverse.java 文件代码:

package runoob.binary;

import java.util.LinkedList;

/**
 * 层序遍历
 */
public class LevelTraverse<Key extends Comparable<Key>, Value>{

    // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现
    private class Node {
        private Key key;
        private Value value;
        private Node left, right;

        public Node(Key key, Value value) {
            this.key = key;
            this.value = value;
            left = right = null;
        }
    }

    private Node root;  // 根节点
    private int count;  // 树种的节点个数

    // 构造函数, 默认构造一棵空二分搜索树
    public LevelTraverse() {
        root = null;
        count = 0;
    }

    // 返回二分搜索树的节点个数
    public int size() {
        return count;
    }

    // 返回二分搜索树是否为空
    public boolean isEmpty() {
        return count == 0;
    }

    // 向二分搜索树中插入一个新的(key, value)数据对
    public void insert(Key key, Value value){
        root = insert(root, key, value);
    }

    // 查看二分搜索树中是否存在键key
    public boolean contain(Key key){
        return contain(root, key);
    }

    // 在二分搜索树中搜索键key所对应的值。如果这个值不存在, 则返回null
    public Value search(Key key){
        return search( root , key );
    }

    // 二分搜索树的前序遍历
    public void preOrder(){
        preOrder(root);
    }

    // 二分搜索树的中序遍历
    public void inOrder(){
        inOrder(root);
    }

    // 二分搜索树的后序遍历
    public void postOrder(){
        postOrder(root);
    }

    // 二分搜索树的层序遍历
    public void levelOrder(){

        // 我们使用LinkedList来作为我们的队列
        LinkedList<Node> q = new LinkedList<Node>();
        q.add(root);
        while( !q.isEmpty() ){

            Node node = q.remove();

            System.out.println(node.key);

            if( node.left != null )
                q.add( node.left );
            if( node.right != null )
                q.add( node.right );
        }
    }

    //********************
    //* 二分搜索树的辅助函数
    //********************

    // 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法
    // 返回插入新节点后的二分搜索树的根
    private Node insert(Node node, Key key, Value value){

        if( node == null ){
            count ++;
            return new Node(key, value);
        }

        if( key.compareTo(node.key) == 0 )
            node.value = value;
        else if( key.compareTo(node.key) < 0 )
            node.left = insert( node.left , key, value);
        else    // key > node->key
            node.right = insert( node.right, key, value);

        return node;
    }

    // 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法
    private boolean contain(Node node, Key key){

        if( node == null )
            return false;

        if( key.compareTo(node.key) == 0 )
            return true;
        else if( key.compareTo(node.key) < 0 )
            return contain( node.left , key );
        else // key > node->key
            return contain( node.right , key );
    }

    // 在以node为根的二分搜索树中查找key所对应的value, 递归算法
    // 若value不存在, 则返回NULL
    private Value search(Node node, Key key){

        if( node == null )
            return null;

        if( key.compareTo(node.key) == 0 )
            return node.value;
        else if( key.compareTo(node.key) < 0 )
            return search( node.left , key );
        else // key > node->key
            return search( node.right, key );
    }

    // 对以node为根的二叉搜索树进行前序遍历, 递归算法
    private void preOrder(Node node){

        if( node != null ){
            System.out.println(node.key);
            preOrder(node.left);
            preOrder(node.right);
        }
    }

    // 对以node为根的二叉搜索树进行中序遍历, 递归算法
    private void inOrder(Node node){

        if( node != null ){
            inOrder(node.left);
            System.out.println(node.key);
            inOrder(node.right);
        }
    }

    // 对以node为根的二叉搜索树进行后序遍历, 递归算法
    private void postOrder(Node node){

        if( node != null ){
            postOrder(node.left);
            postOrder(node.right);
            System.out.println(node.key);
        }
    }
   
}

 

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

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

相关文章

分身空间(应用多开)会员版,提供更便捷的应用多开体验

分身空间&#xff08;应用多开&#xff09;会员版是一款功能强大的跨平台多设备同步工具。通过这个应用&#xff0c;您可以在手机、平板电脑和电脑等多个设备上同时登录和使用多个账号&#xff0c;实现应用的多开。 无论是社交媒体、游戏、聊天工具还是其他应用&#xff0c;分…

Windows MySQL服务安装及问题解决方案

Windows MySQL服务安装及问题解决方案 安装及配置步骤一&#xff1a;官网下网MySQL安装包步骤二&#xff1a;设置环境变量步骤仨&#xff1a;配置MySQL,ini配置文件步骤四&#xff1a;初始化MySQL步骤五&#xff1a;开启MySQL服务步骤六&#xff1a;测试是否安装成功步骤七&…

【Linux】Systemd 中的单元(Unit)和单元文件(Unit File)怎么理解?

单元&#xff08;Unit&#xff09;单元文件&#xff08;Unit File&#xff09;感谢 &#x1f496; 关于systemd是什么&#xff0c;http://t.csdn.cn/pMkG7这篇文章里有详细说明。 这篇文件我们一起来看看Systemd 中的单元&#xff08;Unit&#xff09;和单元文件&#xff08;Un…

C语言经典100例题(50)--#include 的应用练习

目录 题目 问题分析 代码 运行结果 题目 #include 的应用练习 问题分析 头文件的定义&#xff1a;#include 指令告诉预处理器打开指定的文件&#xff0c;并且把此文件的内容插入到当前文件中。因此&#xff0c;如果想让几个源文件可以访问相同的信息&#xff0c;可以把…

算法通关村18关 | 透析回溯的模板

回溯有清晰的解题模板&#xff0c; void backtracking(参数){if (终止条件){存放结果;return;}for (选择本层中的集合元素&#xff08;画成树&#xff0c;就是树节点孩子的大小) {处理节点;backtracking();回溯&#xff0c;撤销处理结果;}} 1. 从N叉树说起 在回溯之前&#x…

克隆阿里巴巴镜像网站的yum源制作自己的yum源

“你会在一间炉火昏黄的房子里死去&#xff0c;而你父亲的魔法全然失效。那张天鹅绒床是如此温热&#xff0c;你的死亡尚有余温之时&#xff0c;我将从风雪中归来……” 主要使用到 nginx 服务器制作 与 vsftpd 服务器不一样的是 nginx 使用到的是 http 协议 xsftpd 使用到的是…

第14章_瑞萨MCU零基础入门系列教程之QSPI

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

103. 二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 题目-中等难度示例1. bfs 题目-中等难度 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09…

常用串口调试工具(列表)

目录 串口调试助手(微软商店可以下载&#xff0c;无广告)UartAssist(串口调试助手)串口调试助手 5.13.1 串口调试助手(微软商店可以下载&#xff0c;无广告) 链接: https://apps.microsoft.com/store/detail/%E4%B8%B2%E5%8F%A3%E8%B0%83%E8%AF%95%E5%8A%A9%E6%89%8B/9NBLGGH4…

sqli-labs-master安装及报错处理

一、环境的安装 1.phpstudy 安装 Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn)https://www.xp.cn/download.html 注意&#xff1a;这里用的是windows版本 2.SQLi-Labs 下载安装 &#xff08;1&#xff09;下载 mirrors / audi-1 / sqli-labs GitCodehttps://gitc…

Java8实战-总结24

Java8实战-总结24 用流收集数据收集器简介收集器用作高级归约预定义收集器 用流收集数据 流可以用类似于数据库的操作帮助你处理集合。可以把Java 8的流看作花哨又懒惰的数据集迭代器。它们支持两种类型的操作&#xff1a;中间操作(如filter或map)和终端操作(如count、findFir…

Android与单片机 | 开发板 | 智能硬件 | 智能设备 | 数据协议 |开发总结

一、缘起 工作中经常遇到需要Android程序与各式各样的板子、智能设备进行交互&#xff0c;通信的方式也基本上都是Ble或者Socket tcp/udp等等…其中最重要的一点就是通信的协议、协议、协议重要的是说三遍&#xff1b;通信协议就是用来定义与设备交互的方式和交互过程中数据包…

企业架构LNMP学习笔记37

1、能够理解读写分离的目的&#xff1b; 2、能够描述读写分离的常见实现方式&#xff1b; 3、能够通过项目框架配置文件实现读写分离&#xff1b; 4、能够通过中间件实现读写分离&#xff1b; 业务背景描述&#xff1a; 时间&#xff1a;2014.6.-2015.9 发布产品类型&#x…

【数据结构】线性表的知识点全面总结

目录 1.线性表的顺序表示 1.1顺序表的基本概念 1.2顺序表的基本操作 1.2.1插入 1.2.2删除 1.2.3查找 2.线性表的链式表示 2.1单链表 单链表的基本概念 2.1.1基本操作 2.1.1.1单链表的建立 2.1.1.2插入 2.1.1.3删除 2.1.1.4查找 2.2双链表 2.2.1基本操作 2.2.1.1插入 2.2.…

MySQL高可用九种方案

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 参考视频 MMM方案&#xff08;单主&#xff09; MySQL高可用方案之MMM&#xff08;Multi-Master Replication Manager&#xff09;是一…

langchain-chatchat或者说fastchat启动访问404的问题

虽然很白痴&#xff0c;但是我还是记录一下我遇到的问题。 1.问题 最近想测试看看langchain的本地知识库效果&#xff0c;看到一个很完备的库&#xff0c;就是lanchain-chatchat。但是我启动了项目后进行对话回答是乱码的。 经过我的排查&#xff0c;问题不出在webui层&…

XSS入门 XSS Challenges

level1(直接注入) <script>alert(xss)</script>level2(双引号闭合标签) 测试 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT>发现<>"被转换&#xff0c;构造新的语句 "><script>alert(/xss/)</…

MySQL高可用搭建方案之(MHA)

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 原文地址 MHA架构介绍 MHA是Master High Availability的缩写&#xff0c;它是目前MySQL高可用方面的一个相对成熟的解决方案&#xff0…

MyBatis 框架入门理论与实践

文章目录 1. MyBatis 框架介绍1.1 MyBatis优点1.2 MyBatis 不足 2. MyBatis 框架整体架构3. MyBatis 的 ORM 介绍4. MyBatis 框架入门开发4.1 入门案例的搭建4.1.1 准备SQL数据4.1.2 新建 SpringBoot 项目4.1.3 pom文件&#xff1a;4.1.4 配置文件4.1.5 mapper 和 mapper.xml4.…

C语言经典100例题(51-54)--学习使用按位与 ,按位或 |,按位异或 ^和按位取反~

目录 题目 问题分析 按位与操作符&#xff08;&&#xff09; 按位或操作符&#xff08;|&#xff09; 按位异或操作符&#xff08;^&#xff09; 按位取反操作符&#xff08;~&#xff09; 代码及运行结果 题目 学习使用按位与& ,按位或 |,按位异或 ^和按位取反…