当前位置:首页 > JavaScript

js实现前序遍历

2026-02-03 03:33:56JavaScript

前序遍历简介

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

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) {
    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),通过临时修改树结构实现:

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
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现投球

js实现投球

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

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…