🥳每日一练-二叉树后序的遍历-JS

上篇文章分享了二叉树的前中序遍历的递归和非递归的 JS 代码实现,这篇文章来分享后序遍历的 JS 代码实现

准备数据

javascript 复制代码
const data = [0, 1, 2, 3, 4, 5, 6, null];

const generateTree = (data, i) => {
	if (!data[i]) return null;
	const root = { value: data[i] };
	root.left = generateTree(data, 2 * i);
	root.right = generateTree(data, 2 * i + 1);

	return root;
};

const tree = generateTree(data, 1);

这里用数组来生成二叉树的数据结构。生成的过程借助了完全二叉树的思想

假设一个节点的序号是 n,那么左子节点的序号就是 2n,右子节点的序号就是 2n+1

数组按照层次遍历的顺序来排列,最后生成的二叉树就是下面这个样子

6 是 3 的 左节点

递归

javascript 复制代码
const postOrder = (tree) => {
	if (tree == null) return;

	postOrder(tree.left);
	postOrder(tree.right);
	console.log(tree.value);
};

代码很容易理解,主要逻辑是先输出左子树,再输出右子树,最后输出当前节点

执行函数

javascript 复制代码
postOrder(tree);

输出顺序正确

非递归

javascript 复制代码
const postOrder2 = (tree) => {
	if (!tree) return;

	const stack = [];
	let pre = null;
	let node = tree;
	while (stack.length !== 0 || node !== null) {
		while (node !== null) {
			stack.push(node);
			node = node.left;
		}

		const currentNode = stack.slice(-1)[0];
		if (currentNode.right !== null && pre !== currentNode.right) {
			node = currentNode.right;
		} else {
			console.log(currentNode.value);
			stack.pop();
			pre = currentNode;
		}
	}
};

非递归的代码比递归要更加复杂些。遍历过程中借助了栈,作为辅助存储空间。遍历过程的重点是判断当前节点的右子树是否已经被访问,如果没有,就需要访问右子树,然后再访问当前节点。

大致过程,从根节点开始,不断地向左子树遍历,过程中将每个遍历到的左节点都入栈,直到左节点为空,这时候就不能再往左了,需要看看当前节点的右节点是否存在,并且没有被访问,如果是,那就往右子树遍历。

右子树的遍历过程也和根节点一致,先不断地向左子树遍历,过程中将每个遍历到的左节点都入栈,直到左节点为空。

代码中借助了 pre 变量来保存上一个访问的节点,用来比较当前节点的右节点,如果相等,说明当前节点的右节点已经被访问了,可以放心地将当前节点输出,并弹出栈。

还可以在节点中保存 tag,用以判断左右节点是否被访问

遍历结果与递归代码一致。

总结:

文章来分享了后序遍历递归和非递归的 JS 代码实现。

之前看到涉及后序遍历的算法是这样的:p 和 q 为二叉树的任意两个节点,请找出 p 和 q 的最近公共祖先节点 r

在后序遍历过程中,总是先访问子节点,然后再访问当前节点。并且访问子节点时,栈中就保存着该子节点的所有父节点。所以掌握了后序遍历,这个算法就不是问题

下篇文章就分享,利用后序遍历来解决这个算法的 JS 代码实现

相关推荐
天若有情6731 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
一切皆是因缘际会1 小时前
从概率拟合到内生心智:2026 下一代 AI 架构演进与落地实践
人工智能·深度学习·算法·架构
Java成神之路-1 小时前
【LeetCode 刷题笔记】34. 在排序数组中查找元素的第一个和最后一个位置 | 二分查找经典刷题题解
算法·leetcode
不忘不弃1 小时前
用BFS方法求解平分汽油问题
算法·宽度优先
AI科技星1 小时前
全域数学·72分册·射影原本 无穷维射影几何卷细化子目录【乖乖数学】
人工智能·线性代数·算法·机器学习·数学建模·数据挖掘·量子计算
风落无尘2 小时前
《智能重生:从垃圾堆到AI工程师》——第四章 变化的艺术
人工智能·线性代数·算法
JAVA面经实录9172 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
AC赳赳老秦2 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
WBluuue2 小时前
Codeforces 1093 Div2(ABCD1D2)
c++·算法
浅念-2 小时前
「一文吃透 BFS:从层序遍历到锯齿形、最大宽度、每层最大值」
数据结构·算法