当前位置:首页 > 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实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

react 如何遍历

react 如何遍历

遍历数组 在React中遍历数组通常使用map方法,它会返回一个新的数组。map是处理数组并渲染列表元素的首选方法。 const items = ['Apple', 'Banana', 'Cherr…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…