当前位置: 首页 > news >正文

二叉排序树的构建与遍历

二叉排序树是一种特殊的二叉树,它的每个节点都满足:左子树所有节点值小于当前节点,右子树所有节点值大于当前节点。

一、二叉排序树的核心结构

首先定义树节点TreeNode,包含左孩子、右孩子和节点值:

public class TreeNode { public TreeNode lChild; public TreeNode rChild; public Integer data; public TreeNode(Integer data){ this.data = data; } }

二、二叉排序树的构建(插入操作)

构建二叉排序树的过程,本质是依次插入节点并维护 “左小右大” 规则的过程。

BinaryTree类的create方法为例:

public class BinaryTree { TreeNode root; public void create(Integer value) { TreeNode newNode = new TreeNode(value); if (root == null) { root = newNode; return; } TreeNode curNode = root; while (true) { if (curNode.data < newNode.data) { if (curNode.rChild == null) { curNode.rChild = newNode; return; } curNode = curNode.rChild; } else { if (curNode.lChild == null) { curNode.lChild = newNode; return; } curNode = curNode.lChild; } } } }

三、二叉排序树的遍历方式

遍历是按一定规则访问树中所有节点的操作,二叉排序树常用深度优先遍历(先序、中序、后序)和广度优先遍历(层次遍历)。

1. 深度优先遍历

(1)先序遍历(根→左→右)
void beforeOrder(TreeNode root) { if (root == null) return; System.out.println(root.data); beforeOrder(root.lChild); beforeOrder(root.rChild); }
(2)中序遍历(左→根→右)

二叉排序树的中序遍历结果是 “升序序列”

void inOrder(TreeNode root) { if (root == null) return; inOrder(root.lChild); System.out.println(root.data); inOrder(root.rChild);
(3)后序遍历(左→右→根)
void afterOrder(TreeNode root) { if (root == null) return; afterOrder(root.lChild); afterOrder(root.rChild); System.out.println(root.data); }

2. 广度优先遍历(层次遍历)

按 “从上到下、从左到右” 的顺序访问节点,借助队列实现:

void levelOrder(TreeNode root) { LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { root = queue.pop(); System.out.println(root.data); if (root.lChild != null) { queue.add(root.lChild); } if (root.rChild != null) { queue.add(root.rChild); } } }

四、二叉排序树的查找操作

利用 “左小右大” 的特性,查找操作可以快速定位节点:

public TreeNode find(TreeNode root, Integer target) { if (root == null) return null; TreeNode cur = root; while (cur != null) { if (cur.data.equals(target)) { return cur; } else if (cur.data < target) { cur = cur.rChild; } else { cur = cur.lChild; } } return null; }

五、测试验证

package com.qcby; public class Test { public static void main(String[] args) { BinaryTree bt = new BinaryTree(); // 构建二叉排序树 bt.create(5); bt.create(3); bt.create(7); bt.create(0); bt.create(4); bt.create(9); bt.levelOrder(bt.root); Integer target = 8; TreeNode result = bt.find(bt.root, target); if (result != null) { System.out.println("找到了"); } else { System.out.println("没找到"); } } }

结果:

http://www.rkmt.cn/news/117201.html

相关文章:

  • AI教学服务平台开发:让“因材施教”有技术撑腰
  • 江南大学810考研,电子信息和通信工程,集成电路,招生人数,分数线,真题,大纲,参考书。
  • Diffusion Transformer:AI如何革新图像生成开发
  • AI CRM系统升级,原圈科技赋能销售洞察
  • 黑马程序员Java视频教程,一套超哇塞的Java教程,java零基础自学网盘地址免费分享
  • 高性价比之选!20万左右新能源 SUV 核心配置与续航实测
  • 2025 最新克拉管服务商 TOP5 评测!四川、贵州、西藏、重庆等地用户推荐,优质厂商权威榜单发布,品质赋能构建给排水新生态 - 全局中转站
  • 2025最新钢带波纹管厂家TOP5评测!深耕四川、贵州、西藏、重庆,西南、西北基建优选品牌榜单发布,品质赋能市政工程建设 - 全局中转站
  • 2025最新MPP电力管品牌TOP5 评测!服务深度覆盖四川、贵州、西藏、重庆,优质服务商权威榜单发布,赋能电力工程建设新发展 - 全局中转站
  • 基于微信小程序的校园义工系统毕业设计全套源码文档
  • 无线充电系统S - S拓扑仿真:WPT闭环控制探索
  • 零基础学会用AI监控网站链接健康状态
  • 曲速推理机故障排除指南
  • CF587F Duff is Mad
  • 用 Go 像写 Web 一样做桌面应用:完全离线的手机号归属地查询工具
  • AI助力SpringBoot+MyBatisPlus开发:自动生成CRUD代码
  • websocket功能开发
  • 分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我...
  • 突破功率密度瓶颈:SiC器件在通信电源中的应用与LLC变换器设计实战
  • Day4 9. 奇怪的信 -卡码网C++基础课
  • HoughLinesP 霍夫变换 C#x2B;#x2B; opencv 内存报错处理
  • Python - UV 为每个项目创建独立、干净的Python工作空间
  • 任务5-2 关联查询和子查询
  • 【计算机毕业设计案例】基于springboot+微信小程序的选修课管理系统的设计与实现“课程查询-在线选课-课表管理-成绩追踪”(程序+文档+讲解+定制)
  • AI如何帮助开发者防御DDoS攻击?
  • WSL2 多 GPU CUDA 初始化问题排查与解决指南
  • zzRAG 的检索优化:MMR 平衡相关性与多样性
  • day40复习日@浙大疏锦行
  • 雷达回波图光流法外推项目实战!
  • Frida-Labs0x3-0xB WP