javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > 树与二叉树定义、概念及JS实现遍历

通俗易懂的彻底掌握树与二叉树定义、核心概念与JS实现遍历完整代码案例

作者:meilindehuzi_a

树结构是一种描述非线性层次关系的数据结构,在一个数结构中,有且仅有一个结点没有直接前驱,这个结点就是树的结点,这篇文章主要介绍了树与二叉树定义、核心概念与JS实现遍历完整代码案例的相关资料,需要的朋友可以参考下

前言

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

一、树的基础认知

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

二、二叉树的核心定义

2.1 递归思维与树的适配性

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

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

经典递归规律公式:

,只要确定递归公式和退出条件,即可解决绝大多数树结构递归问题。

2.2 二叉树严格定义

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

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

三、二叉树关键专业概念

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

四、JavaScript 二叉树的构建方式

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

4.1 基础节点构造函数

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

代码逐行解析:

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

我们构建一棵标准三层二叉树,结构如下:

   A
  /  
 B   C
/ \  / 
D E F G

// 对象字面量声明三层二叉树
const tree = {
    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) 自顶向上思考
//树状结构:相同问题重复迭代,明确递归公式与退出条件
function climbStairs(n) {
    if (n <= 2) return n; // 递归终止条件:1阶1种走法,2阶2种走法
    return climbStairs(n - 1) + climbStairs(n - 2); // 递归公式
}
console.log(climbStairs(10)); 

核心逻辑解析:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

七、知识点总结

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

到此这篇关于通俗易懂的彻底掌握树与二叉树定义、核心概念与JS实现遍历完整代码案例的文章就介绍到这了,更多相关树与二叉树定义、概念及JS实现遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文