654.最大二叉树
var constructMaximumBinaryTree = function(nums) {
if (nums.length == 0) return null;
//如果传入的数组nums为空,返回null
//表示没有节点可以构成二叉树。
let max = nums[0];
//初始化max为数组中的第一个元素。
let index = 0;
//初始化index为0,用于记录当前最大值max的索引。
for (let i = 0; i < nums.length; i++) {
if (nums[i] > max) {
max = nums[i];
index = i;
}
}
//遍历整个数组nums,查找数组中的最大值及其索引。
let root = new TreeNode(max);
//用最大值max创建一个新节点作为根节点。
root.left = constructMaximumBinaryTree(nums.slice(0, index));
//以nums数组的左半部分(即0到index-1的元素)递归地构建左子树
//将返回的根节点作为当前节点的左子节点。
root.right = constructMaximumBinaryTree(nums.slice(index + 1));
//以nums数组的右半部分(即index+1到末尾的元素)递归地构建右子树
//将返回的根节点作为当前节点的右子节点。
return root;
//返回构建好的最大二叉树的根节点。
};
98.验证二叉搜索树
var isValidBST = function(root) {
// 1. 确定递归函数参数
const isValid = function(node, min, max) {
// 定义一个递归函数isValid
// 它接受一个节点node以及当前节点允许的最小值min和最大值max作为参数。
// 2. 确定终止条件
// 如果当前节点为空,返回true,表示当前子树符合要求。
if(node === null) {
return true;
}
// 3. 单层递归逻辑
if(node.val <= min || node.val >= max) {
return false;
}
// 如果当前节点的值小于等于最小值min或者大于等于最大值max
// 则返回false
// 表示当前子树不符合要求。
return isValid(node.left, min, node.val) && isValid(node.right, node.val, max);
// 分别以当前节点的左子节点和右子节点为根节点递归地调用isValid函数
// 更新当前节点的最小值和最大值,直到遇到空节点或者非法节点。
// 如果左右子树均符合要求,则返回true,否则返回
}
return isValid(root, -Infinity, Infinity);
// 以根节点root为起点
// 递归调用isValid函数
// 判断整个二叉树是否是一个合法的二叉搜索树
// 初始化最小值为负无穷,最大值为正无穷。
};
700.二叉搜索树中的搜索
var searchBST = function (root, val) {
if (!root || root.val === val) {
return root;
}
// 如果当前节点为空或者节点的值等于val,则直接返回当前节点
// 这表示已经找到了目标节点或者当前二叉搜索树为空
// 如果目标值val小于当前节点的值
// 则说明目标节点位于当前节点的左子树中
// 递归地在左子树中继续搜索。
// 如果目标值val大于当前节点的值
// 则说明目标节点位于当前节点的右子树中
// 递归地在右子树中继续搜索。
if (root.val > val)
return searchBST(root.left, val);
if (root.val < val)
return searchBST(root.right, val);
};
617.合并二叉树
var mergeTrees = function (root1, root2) {
const preOrder = (root1, root2) => {
if (!root1)
return root2
if (!root2)
return root1;
root1.val += root2.val;
root1.left = preOrder(root1.left, root2.left);
root1.right = preOrder(root1.right, root2.right);
return root1;
}
// 定义一个递归函数preOrder,它接受两个根节点root1和root2作为参数,返回合并后的新根节点。
// 如果root1为空,则返回root2。这表示如果一个树为空,则直接返回另一个树,合并完成。
// 如果root2为空,则返回root1。同样表示如果一个树为空,则直接返回另一个树。
// 将两个根节点的值相加,更新root1的值。
// 递归地将root1的左子树和root2的左子树合并,更新root1的左子树。
// 递归地将root1的右子树和root2的右子树合并,更新root1的右子树。
// 返回合并后的新根节点root1。
// 以两个根节点root1和root2为起点,递归调用preOrder函数,将它们合并成一个新的二叉树,并返回合并后的根节点。
return preOrder(root1, root2);
};