news 2026/4/3 2:51:53

二叉排序树的构建与遍历

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉排序树的构建与遍历

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

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

首先定义树节点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("没找到"); } } }

结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 5:31:05

AI智能预问诊系统开发:看病前先问AI,少排队、少走弯路

去医院看病&#xff0c;很多人都有过这样的糟心体验&#xff1a;不知道挂哪个科瞎排队&#xff0c;好不容易轮到自己&#xff0c;跟医生说病情又颠三倒四&#xff0c;医生得花十分钟追问基础信息&#xff0c;最后真正诊疗的时间没多少。尤其是高峰时段&#xff0c;既耽误自己&a…

作者头像 李华
网站建设 2026/3/28 18:42:35

GEO重大误区之七:大品牌不需要GEO

引言&#xff1a;大品牌与GEO的误区随着AI搜索蓬勃发展&#xff0c;越来越多的企业意识到GEO在提升品牌数字化曝光和竞争力方面的巨大潜力。但&#xff0c;也不免有人会认为&#xff0c;GEO更多的是小企业的“旁门左道”&#xff0c;已经积攒了口碑和影响力的大品牌则没有必要采…

作者头像 李华
网站建设 2026/3/14 2:57:21

1小时搞定ST-Link产品原型开发

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于ST-Link的智能硬件原型系统&#xff0c;包含&#xff1a;1. 无线固件更新功能 2. 实时数据监控界面 3. 硬件诊断工具 4. OTA升级模块 5. 云端配置管理。要求提供完整的…

作者头像 李华
网站建设 2026/4/1 2:24:41

零基础教程:3步用HitPaw去除图片水印

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个简单的图片水印去除网页应用。功能&#xff1a;1) 拖拽上传图片 2) 一键自动去除水印 3) 下载处理后的图片。界面简洁明了&#xff0c;使用纯前端技术(HTML/CSS/JS)实现&am…

作者头像 李华
网站建设 2026/3/31 23:34:22

CDH平台在电商实时推荐系统中的应用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请设计一个基于CDH平台的电商实时推荐系统架构&#xff0c;包含&#xff1a;1. Kafka实时数据采集 2. Spark Streaming处理流水线 3. HBase用户画像存储 4. Redis实时特征缓存 5. 推…

作者头像 李华
网站建设 2026/3/31 20:32:38

26、线程、文件与目录管理技术详解

线程、文件与目录管理技术详解 1. 线程取款操作示例 以下是一个取款操作的代码示例,它使用了互斥锁来确保线程安全: int withdraw (struct account *account, int amount) {pthread_mutex_lock (&account->mutex);const int balance = account->balance;if (ba…

作者头像 李华