news 2026/4/16 12:52:25

二叉树基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树基础

什么是二叉排序树

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

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

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

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

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

二叉排序树的节点结构

二叉排序树由节点组成,每个节点包含三个部分:数据域、左子树指针和右子树指针。在 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);

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

在扩展节点时加入障碍物检测

基于A星与DWA算法融合的动态路径规划&#xff0c;可实现静态避障碍及动态避障深夜撸代码的时候突然想到&#xff0c;路径规划这玩意儿不就是既要全局最优又得能躲开外卖小哥吗&#xff1f;传统A星在静态地图里确实好用&#xff0c;但遇到动态障碍物直接傻眼。DWA&#xff08;Dy…

作者头像 李华
网站建设 2026/4/13 7:40:44

ManySpeech —— 使用 C# 开发人工智能语音应用

跨平台部署的兼容性问题不同场景&#xff08;实时 / 离线、多语言&#xff09;下的模型适配难题复杂工具链的集成门槛作为一套平衡 “易用性、功能性与部署灵活性” 的解决方案&#xff0c;ManySpeech 能够有效提升开发效率&#xff0c;为 .NET 生态下的语音处理需求提供强有力…

作者头像 李华
网站建设 2026/4/12 16:35:32

最长公共子序列(LCS)

题目描述给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。一个字符串的「子序列」是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何字符&#xff09;后组成的新字…

作者头像 李华
网站建设 2026/4/10 9:39:51

算法驱动搜索变革:亚马逊新规则,卖家如何赢下曝光争夺战?

亚马逊搜索排名的算法&#xff0c;始终是卖家运营的核心变量&#xff0c;随着Cosmo新算法的深度应用&#xff0c;一场围绕搜索曝光的规则变革正在重塑流量分配的底层逻辑。 一、规则重构&#xff1a;从“单点突破”到“矩阵压制” 过去&#xff0c;亚马逊对一个商品父体通常只…

作者头像 李华
网站建设 2026/4/11 18:18:40

绩效反馈与辅导的流程

绩效反馈与辅导是绩效管理体系中的核心环节。**要实现绩效反馈的真正价值&#xff0c;关键在于构建科学的沟通流程与辅导机制&#xff0c;使员工在理解反馈的同时获得成长的动力。**绩效管理不只是评分与总结&#xff0c;更重要的是通过有效的反馈与辅导&#xff0c;帮助员工发…

作者头像 李华
网站建设 2026/4/14 11:01:44

夸克 AI 眼镜全链路“无切换体验“:当AI助手真正走进日常

当我们还在讨论AI能否真正融入生活时&#xff0c;有些产品已经悄然给出了答案。最近上手了夸克最新推出的AI眼镜&#xff0c;说实话&#xff0c;在戴上之前我把预期降到了很低——毕竟市面上打着"智能"旗号却体验糟糕的产品实在太多了。但戴上去的那一刻&#xff0c;…

作者头像 李华