news 2026/4/3 3:18:17

力扣二叉树的三种遍历

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣二叉树的三种遍历

这篇文章类比三种遍历的写法,每个遍历利用两种方法,分别是递归和迭代,帮助更好的学习二叉树的相关知识。

一、前序

两种方法:

1.递归

/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[]} */ var preorderTraversal = function(root) { const res = []; const preorder = (node) => { if(node === null) return; //先搜集根节点 res.push(node.val); //递归遍历左子树 preorder(node.left); //递归遍历右子树 preorder(node.right) } preorder(root); return res; };

2.迭代

/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[]} */ var preorderTraversal = function(root) { const res = []; // 存储遍历结果 const stk = []; // 模拟递归的栈 // 循环条件和中序/后序一致:当前节点非空 或 栈非空 while (root || stk.length) { while (root) { res.push(root.val); stk.push(root); root = root.left; } root = stk.pop(); root = root.right; } return res; };

二、中序

两种方法:

1.递归

/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[]} */ var inorderTraversal = function(root) { const res = []; const inorder = (node) => { if (node === null) return; // 先递归遍历左子树 inorder(node.left); // 收集当前节点值 res.push(node.val); // 再递归遍历右子树 inorder(node.right); }; inorder(root); return res; };

2.迭代

var inorderTraversal = function(root) { const res = []; const stk = []; while (root || stk.length) { while (root) { stk.push(root); root = root.left; } root = stk.pop(); res.push(root.val); root = root.right; } return res; };

三、后序

两种方法:

1.递归

/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[]} */ var postorderTraversal = function(root) { const res = []; const postorder = (node) => { if(node === null) return; //递归遍历左子树 postorder(node.left); //递归遍历右子树 postorder(node.right); //先搜集根节点 res.push(node.val); } postorder(root); return res; };

2.迭代

var postorderTraversal = function(root) { const res = []; const stk = []; let prev = null; while (root || stk.length) { while (root) { stk.push(root); root = root.left; } root = stk.pop(); if (!root.right || root.right === prev) { res.push(root.val); prev = root; root = null; } else { stk.push(root); root = root.right; } } return res; };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 21:43:44

31、Azure 实用技巧与资源管理指南

Azure 实用技巧与资源管理指南 1. Azure Traffic Manager 基础 Azure Traffic Manager 是一项重要的 Azure 服务,它主要用于流量分配。通过学习该服务,我们了解了流量分配的基本概念和不同的路由方法,这些方法能覆盖许多日常工作中可能遇到的实际用例。合理使用其配置、真…

作者头像 李华
网站建设 2026/4/1 23:19:07

Zookeeper在大数据集群中的作用详解

什么是Zookeeper? Apache Zookeeper 本质上是一个分布式的、开源的协调服务。 您可以把它想象成大数据集群的“神经系统”或“总指挥部”。 它本身并不存储业务数据,而是专门负责管理和维护整个分布式系统所需的配置信息、命名服务、分布式同步和集群管理…

作者头像 李华
网站建设 2026/3/30 2:29:58

无物无尘处,本心自清明

“菩提本无树,明镜亦非台。本来无一物,何处惹尘埃?” 这四句《菩提偈》,字字如珠玑,穿透千年的时光,依然在禅宗史上回响不绝。它是六祖惠能对佛法真谛的顿悟,更是对人心本质的深刻叩问&#xff…

作者头像 李华
网站建设 2026/4/3 3:08:03

10、Linux内核开发全解析:从配置到调试与Yocto集成

Linux内核开发全解析:从配置到调试与Yocto集成 1. Kconfig文件选项与配置 在Linux内核开发中,Kconfig文件起着关键作用,它提供了不同类型的选项,具体如下: | 选项类型 | 描述 | | ---- | ---- | | bool | 具有true或false值的选项 | | tristate | 除了true和false选…

作者头像 李华
网站建设 2026/3/19 18:21:45

React 状态更新中的双缓冲机制、优先级调度

文章主要解释了 React 如何处理状态更新,特别是其双缓冲机制和优先级调度。 文章内容结合 deepseek 进行了汇总 一、UpdateQueue 的结构与双缓冲机制 1. 更新队列是一个链表 每个 Update 代表一个状态更新(如 setState)。队列按插入顺序存储…

作者头像 李华