当前位置:首页 > JavaScript

js实现前序遍历

2026-03-16 04:17:51JavaScript

前序遍历简介

前序遍历(Pre-order Traversal)是二叉树遍历的一种方式,遍历顺序为:根节点 → 左子树 → 右子树。常用于复制树结构或表达式的序列化。

js实现前序遍历

递归实现

递归是最直观的实现方式,代码简洁易懂:

js实现前序遍历

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) {
    if (!root) return [];
    const stack = [root];
    const result = [];
    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) 的算法,通过临时修改树结构实现:

function preorderTraversal(root) {
    let curr = root;
    const result = [];
    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 遍历会修改原始树结构,必要时需恢复。

复杂度对比

方法 时间复杂度 空间复杂度
递归 O(n) O(h)
迭代 O(n) O(h)
Morris O(n) O(1)

其中 h 为树的高度,n 为节点数量。

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

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…