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

二叉树基础

什么是二叉排序树

二叉排序树又称二叉查找树,是一种特殊的二叉树,它的每个节点都包含一个数据域,且具有以下特点:

若左子树不为空,则左子树上所有节点的值均小于它的根节点的值

若右子树不为空,则右子树上所有节点的值均大于它的根节点的值

左、右子树也分别为二叉排序树

这种结构使得二叉排序树具有高效的查找、插入和删除操作特性。

二叉排序树的节点结构

二叉排序树由节点组成,每个节点包含三个部分:数据域、左子树指针和右子树指针。在 Java 中,我们可以用类来定义节点:

public class TreeNode {

public TreeNode lChild; // 左子树指针

public TreeNode rChild; // 右子树指针

public Integer data; // 数据域

// 构造方法,初始化数据

public TreeNode(Integer data){

this.data = data;

}

}

二叉排序树的构建

构建思路

构建二叉排序树的核心是插入操作,插入过程遵循以下规则:

若树为空,则新节点作为根节点

若树不为空,则从根节点开始比较:

若新节点值小于当前节点值,则向左子树移动

若新节点值大于当前节点值,则向右子树移动

重复上述过程,直到找到合适的空位置插入新节点

public class BinaryTree {

// 根节点指针

TreeNode root;

// 插入节点方法

public void create(Integer value){

// 1. 创建新节点

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;

}

}

}

// 后续代码省略...

}

二叉排序树的遍历

二叉排序树的遍历分为深度优先遍历和广度优先遍历两大类。

深度优先遍历(递归实现)

深度优先遍历包括先序遍历、中序遍历和后序遍历,它们的区别在于访问根节点的时机不同。

先序遍历(根左右)

// 先序遍历:根 -> 左 -> 右

void beforeOrder(TreeNode root){

if(root == null){

return;

}

System.out.println(root.data); // 访问根节点

beforeOrder(root.lChild); // 遍历左子树

beforeOrder(root.rChild); // 遍历右子树

}

中序遍历(左根右)

// 中序遍历:左 -> 根 -> 右

void inOrder(TreeNode root){

if(root == null){

return;

}

inOrder(root.lChild); // 遍历左子树

System.out.println(root.data); // 访问根节点

inOrder(root.rChild); // 遍历右子树

}

注意:二叉排序树的中序遍历结果是一个有序序列,这是其重要特性

后序遍历(左右根)

// 后序遍历:左 -> 右 -> 根

void afterOrder(TreeNode root){

if(root == null){

return;

}

afterOrder(root.lChild); // 遍历左子树

afterOrder(root.rChild); // 遍历右子树

System.out.println(root.data); // 访问根节点

}

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

层次遍历按照树的层次依次访问每个节点,需要借助队列来实现:

// 层次遍历

void levelOrder(TreeNode root){

LinkedList<TreeNode> queue = new LinkedList<TreeNode>();

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 class Test {

public static void main(String[] args) {

BinaryTree tree = new BinaryTree();

// 插入节点

tree.create(5);

tree.create(3);

tree.create(7);

tree.create(0);

tree.create(4);

tree.create(6);

tree.create(9);

System.out.println("先序遍历:");

tree.beforeOrder(tree.root);

http://www.cnnetsun.cn/news/115286.html

相关文章:

  • 微软和布朗大学最新发现:让AI助手拥有18000多种技能的革命性突破
  • MATLAB仿真:二维TOA传感器网络定位与时钟偏差拟合,最小二乘求解
  • 【参数辨识】基于卡尔曼滤波(KF)估计离散线性系统对垂直起降(VTOL)飞行器的鲁棒辨识附matlab代码
  • 桥梁与隧道安全守护者 抗冰冻型风速监测方案
  • 05-FreeRTOS的内存管理
  • 基于改进蛇优化算法(GOSO/ISO)优化随机森林数据回归预测模型(含初始化种群混沌映射、减法...
  • 基于大数据的人脸识别系统设计与实现开题报告
  • 车载 Android 系统稳定性问题全解析:从性能到黑屏的排查指南
  • 气象在线监测系统助力智慧环境管理,金叶仪器专业气象监测解决方案
  • 【TVM 教程】交叉编译与 RPC
  • 腾讯云国际站代理商的QAPM服务能提供哪些专属服务?
  • 网安副业怎么选?漏洞挖掘、技术博客、竞赛奖金实战,哪个更适配你?
  • 量子计算验证方法:软件测试从业者的转型指南
  • 突破 Oracle/MySQL 瓶颈:金仓数据库以三重革新,筑牢业务转型 “数据底座”
  • 【学习神器】NotebookLM“播客”功能实战指南:四六级、考研党高效复习秘籍
  • 如何解决 pip install 网络报错 ERROR: No matching distribution found for requests
  • 12 Ways to Find User Account Info and Login Details in Linux
  • 紧急警告:错误的导出格式正毁掉你的量子实验成果,速查正确方式
  • 35 岁职场焦虑蔓延?为什么网络安全行业越老越值钱?
  • 内网渗透实战干货:12 个优质靶场平台精选,附避坑指南 + 实操技巧合集!
  • 新型电力系统下多分布式电源接入配电网承载力评估方法研究附Matlab代码
  • 50天学习FPGA第16天-verilog的模块与端口
  • 50天学习FPGA第15天-verilog基本概念
  • 基于Docker容器化部署Lsky Pro私有图床系统
  • GRPO不香了?小米ICPO横空出世,专治大模型“不会思考”,推理能力飙升!
  • Windows找不到xenroll.dll文件 如何下载修复?
  • 软件测试文档标准化编写指南
  • Paperzz AI:毕业论文写作的 “隐形助攻”,让学术输出告别 “抓瞎”
  • BypassAV通过Patch白文件实现Bypass,没有添加其他免杀手法
  • 鸿蒙:一个操作系统的生态远征与多行业渗透之路