这是二叉树的一个品类,搞得不多。
二叉搜索树呢,也多是 中序遍历,这和 二叉树无关,关乎我们对二叉树的进一步认识。
1.有序数组 生成 二叉搜索树
108. 将有序数组转换为二叉搜索树
1382. 将二叉搜索树变平衡
借助 108 的解题思路
var balanceBST = function(root) {let nums = [];function dfs(node) {if (!node) {return;}dfs(node.left);nums.push(node.val);dfs(node.right);}dfs(root); // 生成有序数组let n = nums.length;function createTree(left, right) {if (left > right) {return null;}let mid = left + Math.floor((right - left) / 2);let newNode = new TreeNode(nums[mid]);newNode.left = createTree(left, mid - 1);newNode.right = createTree(mid + 1, right);return newNode;}return createTree(0, n - 1); // 根据有序数组递归生成平衡树};
96. 不同的二叉搜索树
根据有序数组生成 二叉搜索树是不唯一的,本题就是数数,但是用到的是动态规划的思路。
var numTrees = function(n) {let dp = new Array(n + 1).fill(0);dp[0] = 1;dp[1] = 1;for (let i = 2; i <= n; i++) {for (let j = 0; j < i; j++) {dp[i] += dp[j] * dp[i - 1 - j]; // 就是硬找规律}}return dp[n];};
285. 二叉搜索树中的中序后继
var inorderSuccessor = function(root, p) {let target = null;let hasfound = false;function dfs(node) {if (!node) {return null;}// 一开始我把中序遍历的操作 当做条件阻挡放在前序的位置,这样的操作其实很错乱// if (hasfound) {// if (target === null) { // 第一次赋值// target = node;// }// return;// }dfs(node.left);// 这是递归返回要一直执行的地方啊if (p.val === node.val) {hasfound = true;} else if (hasfound) {if (target === null) { // 第一次赋值target = node;}return;}dfs(node.right);}dfs(root);return target;};
510. Inorder Successor in BST II
var inorderSuccessor = function(node) { // 只能向上走,缺乏向下走的路if (node === null) {return null;}// 先找 root 可转化题目为 285 leetcodelet root = node;while (root.parent) { // 找 rootroot = root.parent;}let hasfound = false;let target = null;function dfs(n) {if (!n) {return null;}dfs(n.left);if (n.val === node.val) {hasfound = true;} else if (hasfound) {if (target === null) {target = n; // 大意的错误}return;}dfs(n.right);}dfs(root);return target;};
