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

通俗易懂掌握树与二叉树:定义、核心概念与JS实现遍历

通俗易懂掌握树与二叉树:定义、核心概念与JS实现遍历

  • 一、树的基础认知
  • 二、二叉树的核心定义
    • 2.1 递归思维与树的适配性
    • 2.2 二叉树严格定义
  • 三、二叉树关键专业概念
  • 四、JavaScript 二叉树的构建方式
    • 4.1 基础节点构造函数
    • 4.2 完整三层二叉树实例构建
  • 五、递归思想辅助案例:爬楼梯算法
  • 六、二叉树四大遍历方式(JS完整实现)
    • 6.1 前序遍历(根 → 左 → 右)
    • 6.2 中序遍历(左 → 根 → 右)
    • 6.3 后序遍历(左 → 右 → 根)
    • 6.4 层序遍历(迭代队列实现)
  • 七、知识点总结

在数据结构体系中,树结构是极其重要的非线性数据结构,广泛应用于搜索、排序、层级渲染等各类开发场景。而二叉树是树结构的基础核心,绝大多数复杂树结构(平衡树、红黑树等)均基于二叉树延伸而来。本文将从基础概念出发,结合JavaScript完整代码案例,系统讲解树与二叉树的核心知识点、递归思想、节点构建与四大遍历方式,帮助大家从零吃透二叉树基础。

一、树的基础认知

数据结构中的树,是对现实世界树木的数学抽象与简化,为了方便计算机运算,我们将树结构倒置展示(根在上、叶子在下),核心对应关系如下:

  • 根节点:对应现实树木的树根,是整棵树的顶层起始节点
  • :对应树枝,用于连接上下级节点,代表节点间的关联关系
  • 节点:对应树枝的两端载体,是存储数据的基本单元
  • 叶子节点:对应现实树叶,是树结构中最末端、无后续子节点的节点
    不同于数组、链表等线性结构,树结构是典型的分层非线性结构,天然适配递归解题思想。

二、二叉树的核心定义

2.1 递归思维与树的适配性

二叉树的官方定义采用递归思想,递归的核心逻辑可总结为三点:自顶向下拆解大问题、重复处理相似子问题、设置明确递归终止条件。

树结构是递归的最佳应用场景:整棵树和子树的结构完全一致,大问题(整棵树处理)可以拆解为相同逻辑的小问题(子树处理)。递归的底层依赖函数栈实现,若递归层级过深,会导致栈内存溢出,即常说的“爆栈”。

经典递归规律公式:f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2)f(n)=f(n1)+f(n2),只要确定递归公式和退出条件,即可解决绝大多数树结构递归问题。

2.2 二叉树严格定义

很多初学者会误区:将二叉树定义为“每个节点最多有2个子节点的树”,这是不严谨的。二叉树的严格递归定义如下:

  1. 二叉树可以是空树(无任何根节点);
  2. 若非空树,则一定由根节点左子树右子树三部分组成;
  3. 左子树和右子树本身也必须是合法的二叉树。
    核心关键点:二叉树的左右子树不可交换,位置是严格固定的,这是它与普通多叉树的核心区别。

三、二叉树关键专业概念

掌握基础概念是读懂二叉树、写对遍历代码的前提,所有概念均有统一计算规范:

  • 层次:根节点默认是第一层,根的子节点为第二层,以此向下逐层递增;
  • 高度:从当前节点到最远端叶子节点的路径长度。叶子节点高度为1,每向上一层高度+1;
  • 深度:从根节点到当前节点的路径长度,根节点深度为1,向下逐层递增;
  • 节点的度:一个节点拥有的子树数量,二叉树节点的度只能是0、1、2;
  • 叶子节点:度为0的节点,即没有任何子节点的末端节点。

四、JavaScript 二叉树的构建方式

在JS中,二叉树节点的核心结构分为三部分:数据域(存储节点值)左子节点引用右子节点引用。下面通过构造函数和对象字面量两种方式完整构建二叉树。

4.1 基础节点构造函数

functionTreeNode(val){this.val=val;this.left=this.right=null;//赋值从右到左}

代码逐行解析:

  • 定义构造函数TreeNode,用于批量生成二叉树节点;
  • this.val = val:数据域,接收并存储当前节点的数值/内容;
  • this.left = this.right = null:初始化左右子节点,默认值为空。JS赋值遵循从右到左规则,先将right赋值为null,再将left赋值为right的结果,保证初始节点无任何子节点。

4.2 完整三层二叉树实例构建

我们构建一棵标准三层二叉树,结构如下:
A
/
B C
/ \ /
D E F G

// 对象字面量声明三层二叉树consttree={val:"A",left:{val:"B",left:{val:"D",left:null,right:null,},right:{val:"E",left:null,right:null,},},right:{val:"C",left:{val:"F",left:null,right:null,},right:{val:"G",left:null,right:null,},},};// 节点访问测试console.log(tree.val);// "A" 访问根节点console.log(tree.left.val);// "B" 访问根节点左子节点console.log(tree.left.left.val);// "D" 访问B节点的左子节点console.log(tree.right.right.val);// "G" 访问C节点的右子节点

代码解析:通过对象字面量递归嵌套的方式,完全贴合二叉树的递归定义,每一个节点都是一个独立的、包含val/left/right属性的对象,叶子节点的leftright均为null,符合空子树规范。同时通过测试代码验证了层级节点的访问逻辑。

五、递归思想辅助案例:爬楼梯算法

为了更直观理解二叉树依赖的递归逻辑,我们结合经典的爬楼梯案例,该案例完美契合树状递归规律,可辅助理解递归公式与终止条件的设计思路。

//f(n) 自顶向上思考//树状结构:相同问题重复迭代,明确递归公式与退出条件functionclimbStairs(n){if(n<=2)returnn;// 递归终止条件:1阶1种走法,2阶2种走法returnclimbStairs(n-1)+climbStairs(n-2);// 递归公式}console.log(climbStairs(10));

核心逻辑解析:

  • 自顶向下拆解问题:爬到第n阶楼梯的走法 = 爬到n-1阶的走法 + 爬到n-2阶的走法;
  • 终止条件:n≤2时直接返回结果,避免无限递归;
  • 整体逻辑与二叉树递归遍历一致:子问题和父问题逻辑相同,仅规模不同,依靠递归逐层拆解直至触底。

六、二叉树四大遍历方式(JS完整实现)

遍历是二叉树最核心的操作,本质是按照固定规则访问树中所有节点且不重复、不遗漏。二叉树遍历分为两大类:递归遍历(前序、中序、后序)、迭代遍历(层序)。其中递归遍历固定遵循先左后右的规则。

6.1 前序遍历(根 → 左 → 右)

遍历规则:优先访问根节点,再递归遍历左子树,最后递归遍历右子树。

functionpreorder(node){if(!node)return;// 递归终止:空节点直接返回console.log(node.val);// 1. 处理当前根节点preorder(node.left);// 2. 递归遍历左子树preorder(node.right);// 3. 递归遍历右子树}// 遍历结果:A B D E C F Gpreorder(tree);

6.2 中序遍历(左 → 根 → 右)

遍历规则:优先递归遍历左子树,再访问当前根节点,最后递归遍历右子树。二叉搜索树的有序输出依赖中序遍历。

functioninorder(node){if(!node)return;// 递归终止inorder(node.left);// 1. 优先遍历左子树console.log(node.val);// 2. 处理当前根节点inorder(node.right);// 3. 遍历右子树}// 遍历结果:D B E A F C Ginorder(tree);

6.3 后序遍历(左 → 右 → 根)

遍历规则:优先递归遍历左子树,再递归遍历右子树,最后访问当前根节点。常用于树节点的销毁、删除操作。

functionpostorder(node){if(!node)return;// 递归终止postorder(node.left);// 1. 遍历左子树postorder(node.right);// 2. 遍历右子树console.log(node.val);// 3. 最后处理根节点}// 遍历结果:D E B F G C Apostorder(tree);

6.4 层序遍历(迭代队列实现)

区别于递归遍历,层序遍历是自上而下、逐层从左到右遍历节点,需要借助队列先进先出的特性实现,属于迭代遍历方式。

functionlevelOrder(node){constqueue=[];// 定义队列,存储待遍历节点constresult=[];// 存储遍历结果if(!node)returnresult;// 空树直接返回空数组queue.push(node);// 根节点入队while(queue.length){constcur=queue.shift();// 队首节点出队result.push(cur.val);// 记录当前节点值if(cur.left)queue.push(cur.left);// 左子节点优先入队if(cur.right)queue.push(cur.right);// 右子节点后入队}returnresult;}// 遍历结果:[ 'A', 'B', 'C', 'D', 'E', 'F', 'G' ]console.log(levelOrder(tree));

七、知识点总结

  1. 二叉树的核心是递归结构,左右子树位置固定,不可互换,区别于普通树;
  2. JS二叉树节点固定包含:数据域、左子节点引用、右子节点引用;
  3. 递归遍历核心:前中后序仅根节点的访问时机不同,均遵循先左后右;
  4. 层序遍历依赖队列特性,是唯一的逐层遍历方式,适合处理层级相关业务;
  5. 递归解题三要素:拆解重复子问题、推导递归公式、设置终止条件,同时需注意递归深度避免爆栈。
http://www.gsyq.cn/news/1505471.html

相关文章:

  • 2026年6月最新版驻马店第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • Java IO流总结
  • 2026年6月最新版遵义第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一修哥咨询
  • 深度解码:为什么你的PCSX2跑不满60帧?3个被忽视的性能瓶颈揭秘
  • 2026山东五恒空调厂家实力排行:核心维度实测对比 - 起跑123
  • 从LXC到Docker:深入解析容器技术的演进、核心原理与选型指南
  • 2026年6月电子线生产厂家口碑推荐,行业内电子线源头厂家,耐化学腐蚀,延长使用寿命 - 品牌推荐师
  • 超元力玻璃剧场轻量化落地体系,构筑文旅业态长效运营新基石
  • 昆明社区回收店测评:家门口小店靠谱吗?实测结果意外 - 奢侈品回收评测
  • 华硕笔记本性能调优神器:5步掌握G-Helper完整使用指南
  • 2026 韶关黄金回收价位盘点 全城实体门店综合测评 - 靖昱黄金回收
  • 从零到一:手把手教你打造STC89C52RC最小系统板
  • 国内激光清障仪主流厂家实力排行及核心资质盘点 - 奔跑123
  • 面向企业知识库问答的 RAG 落地实践:大模型如何从“会聊天”变成“懂业务”
  • 如何在10分钟内彻底掌握Etcher镜像烧录工具的核心用法
  • SD-PPP:Photoshop AI插件终极免费指南,让设计创作更智能高效
  • 2026年PCBA加工丨smt加工丨贴片加工行业十大靠谱工厂榜单出炉,广东东莞这家企业凭什么入选? - 变量人生001
  • 从零上手树莓派:系统烧录与无屏无线连接实战
  • DDrawCompat:让Windows 11流畅运行经典DirectX老游戏的兼容性解决方案
  • TripoSR高性能3D重建架构解析与生产环境部署指南
  • Layui-admin:企业级后台管理系统的极速开发解决方案
  • 三步掌握猫抓插件:小白也能轻松下载网页视频音频
  • TransitionableTab自定义动画教程:解锁4种预设效果与无限可能
  • 劳力士没有保卡还能高价回收吗?来沈阳收的顶当面检测成色细节给你答案 - 奢侈品回收评测
  • 2026济南名表回收靠谱渠道盘点无套路高价变现攻略 - 奢侈品回收评测
  • 温度采集卡怎么选?ZLinear三款主流型号深度横评
  • openEuler嵌入式开发:面向IoT和边缘计算的完整解决方案
  • 2026企业微信SCRM收费标准:全国统一报价+无隐形消费指南 - 资讯速览
  • 2026:青神县新房除甲醛公司横向测评,实地对比后优先选四川家之源环保科技有限公司 - 专注室内空气检测治理
  • Daruk实战案例:构建一个完整的博客系统后端终极指南