代码随想录算法训练营第十三天 | 二叉树的便历

30 阅读1分钟

前序便历:中左右

中序便历:左中右

后序遍历:左右中

层序遍历:广度优先

递归

var preorderTraversal = function (root) {
	const traversal = (node, arr) => {
		if (node === null) {
			return null;
		}
		arr.push(node.val);
		traversal(node.left, arr);
		traversal(node.right, arr);
	};
	const res = [];
	traversal(root, res);
	return res;
};

迭代

// 前序
var preorderTraversal = function (root) {
	if (root === null) {
		return [];
	}
	const queue = [];
	const res = [];
	queue.push(root);
	while (queue.length) {
		const curr = queue.pop();
		res.push(curr.val);
		curr.right && queue.push(curr.right);
		curr.left && queue.push(curr.left);
	}
	return res;
};

// 后序
var postorderTraversal = function (root) {
	if (root === null) {
		return [];
	}
	const queue = [];
	const res = [];
	queue.push(root);
	while (queue.length) {
		const curr = queue.pop();
		res.push(curr.val);
		curr.left && queue.push(curr.left);
		curr.right && queue.push(curr.right);
	}
	return res.reverse();
};

// 中序
var inorderTraversal = function (root) {
	let stack = [];
	let res = [];
	let cur = root;
	while (stack.length || cur) {
		if (cur.left) {
			stack.push(cur.left);
			cur = cur.left;
		} else {
			cur = stack.pop();
			res.push(cur.val);
			cur = cur.right;
		}
	}
};

空指针标记

// 统一迭代法 空指针标记 后面有null的节点才需要处理
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function (root) {
	let stack = [];
	let res = [];
	if (root) {
		stack.push(root);
	}
	while (stack.length) {
		const cur = stack.pop();
		if (!cur) {
			res.push(stack.pop().val);
			continue;
		}
		cur.right && stack.push(cur.right);
		cur.left && stack.push(cur.left);
		stack.push(cur);
		stack.push(null);
	}
	return res;
};

层序便历(广度优先)

// 层序便历
var levelOrder = function (root) {
	let queue = [];
	let res = [];
	// 注意这里可能会出错
	if (!root) return res;
	queue.push(root);

	while (queue.length) {
		let length = queue.length;
		let currList = [];
		for (let i = 0; i < length; i++) {
			let cur = queue.shift();
			currList.push(cur.val);
			cur.left && queue.push(cur.left);
			cur.right && queue.push(cur.right);
		}
		res.push(currList);
	}

	return res;
};