当前位置:首页 > JavaScript

js实现前序遍历

2026-02-03 03:33:56JavaScript

前序遍历简介

前序遍历(Preorder Traversal)是二叉树遍历的一种方式,顺序为:根节点 → 左子树 → 右子树。以下是 JavaScript 实现前序遍历的几种方法。

递归实现

递归是最直观的方法,代码简洁:

function preorderTraversal(root) {
    const result = [];
    function traverse(node) {
        if (!node) return;
        result.push(node.val); // 访问根节点
        traverse(node.left);   // 遍历左子树
        traverse(node.right);  // 遍历右子树
    }
    traverse(root);
    return result;
}

迭代实现(使用栈)

通过栈模拟递归过程,避免递归的调用栈开销:

function preorderTraversal(root) {
    const result = [];
    const stack = [];
    if (root) stack.push(root);
    while (stack.length) {
        const node = stack.pop();
        result.push(node.val); // 访问根节点
        // 右子树先入栈,保证左子树先处理
        if (node.right) stack.push(node.right);
        if (node.left) stack.push(node.left);
    }
    return result;
}

Morris 遍历

空间复杂度优化为 O(1),通过临时修改树结构实现:

js实现前序遍历

function preorderTraversal(root) {
    const result = [];
    let curr = root;
    while (curr) {
        if (!curr.left) {
            result.push(curr.val);
            curr = curr.right;
        } else {
            let predecessor = curr.left;
            while (predecessor.right && predecessor.right !== curr) {
                predecessor = predecessor.right;
            }
            if (!predecessor.right) {
                result.push(curr.val); // 访问根节点
                predecessor.right = curr;
                curr = curr.left;
            } else {
                predecessor.right = null;
                curr = curr.right;
            }
        }
    }
    return result;
}

注意事项

  • 递归方法在树深度较大时可能导致栈溢出。
  • 迭代方法通过显式栈结构更安全,适合大规模数据。
  • Morris 遍历节省空间,但会修改原始树结构(临时性)。

根据需求选择合适的方法,递归适合简单场景,迭代和 Morris 适用于性能敏感场景。

标签: 遍历js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…