代码随想录算法训练营第十八天 | 二叉树

43 阅读2分钟

LeetCode 704. 二分查找

📖 考察点

二叉搜索树相关 一般中序便历

📖 题意理解

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

💡 解题思路

比较前后的差 记录最小值

🔑 关键点总结

💻 代码实现

JavaScript

var getMinimumDifference = function (root) {
	let stack = [];
	let pre = null;
	let cur = root;
	let res = Number.MAX_SAFE_INTEGER;
	while (stack.length || cur) {
		if (cur) {
			stack.push(cur);
			cur = cur.left;
		} else {
			cur = stack.pop();
			if (pre) {
				res = Math.min(res, Math.abs(pre.val - cur.val));
			}
			pre = cur;
			cur = cur.right;
		}
	}
	return res;
};

⏱️ 复杂度分析

📚 总结与反思


LeetCode 501.二叉搜索树中的众数

📖 考察点

二叉搜索树,一般前序便历

📖 题意理解

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

💡 解题思路

前序便历,记录出现次数最多的数

🔑 关键点总结

前序便历

💻 代码实现

JavaScript

var findMode = function (root) {
	let res = new Set();
	let maxCount = 0;
	let curCount = 0;
	let cur = root;
	let stack = [];
	let pre = root.val;
	while (stack.length || cur) {
		if (cur) {
			stack.push(cur);
			cur = cur.left;
		} else {
			cur = stack.pop();
			if (cur.val === pre.val) {
				curCount++;
			} else {
				curCount = 1;
			}
			if (curCount > maxCount) {
				maxCount = curCount;
				res = new Set();
				res.add(cur.val);
			} else if (curCount === maxCount) {
				res.add(cur.val);
			}
			pre = cur;
			cur = cur.right;
		}
	}
	return Array.from(res);
};

Rust


⏱️ 复杂度分析

📚 总结与反思


LeetCode 236. 二叉树的最近公共祖先

📖 考察点

后序便历 考虑好返回的情况

📖 题意理解

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

💡 解题思路

🔑 关键点总结

后序遍历

💻 代码实现

JavaScript

var lowestCommonAncestor = function (root, p, q) {
	let res = null;
	const findNode = (node, p, q) => {
		if (!node) {
			return 0;
		}
		let resLeft = 0;
		let resRight = 0;
		root.left && (resLeft = findNode(node.left, p, q));
		root.right && (resRight = findNode(node.right, p, q));
		if (res) {
			return -1;
		}
		let power = resLeft | resRight;
		if (node === p) {
			power |= 10;
		}
		if (node === q) {
			power |= 100;
		}
		if ((power & 110) === 110) {
			res = node;
		}
		return power;
	};
	findNode(root, p, q);
	return res;
};