LeetCode 654.最大二叉树
题目链接🔗:654.最大二叉树
解题思路🤔
递归法
- 确定递归函数的参数和返回值
- 参数:存放元素的数组
- 返回值:该数组构造的二叉树的头节点
- 确定终止条件
- 当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点
- 定义一个新节点,把这个数组的数值赋给新节点并返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。
- 确定单层递归的逻辑
- 找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组
- 最大值所在的下标左区间 构造左子树:
maxValueIndex > 0
,保证左区间至少有一个数值 - 最大值所在的下标右区间 构造右子树:
maxValueIndex < (nums.size() - 1)
,确保右区间至少有一个数值
遇到的问题😢
代码实现👨🏻💻
递归法
var constructMaximumBinaryTree = function (nums) {
const BuildTree = (arr, left, right) => {
if (left > right) return null;
let maxValue = -1;
let maxIndex = -1;
for (let i = left; i <= right; ++i) {
if (arr[i] > maxValue) {
maxValue = arr[i];
maxIndex = i;
}
}
let root = new TreeNode(maxValue);
root.left = BuildTree(arr, left, maxIndex - 1);
root.right = BuildTree(arr, maxIndex + 1, right);
return root;
}
let root = BuildTree(nums, 0, nums.length - 1);
return root;
};
总结📖
LeetCode 617.合并二叉树
题目链接🔗:617.合并二叉树
解题思路🤔
遍历两个树与遍历一个树逻辑是一样的,只不过传入的是两个树的节点,同时操作。
递归法:
-
确定递归函数的参数和返回值
- 参数:两个二叉树的根节点
- 返回值:合并之后二叉树的根节点
-
确定终止条件
存在两个树遍历的节点t1 和 t2,如果
t1 == null
,两个树合并后结果是 t2 ;反之为t1(如果t1 / t2也为NULL也无所谓,合并之后就是NULL)。 -
确定单层递归的逻辑
假设t1是合并之后树的根节点。在单层递归中,就要把两棵树的元素加到一起:
t1->val += t2->val;
接下来 t1 的左子树是:合并 t1左子树、t2左子树之后的左子树。
t1 的右子树是: 合并 t1右子树、t2右子树之后的右子树。
最终t1就是合并之后的根节点。
遇到的问题😢
代码实现👨🏻💻
递归法
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;
}
return preOrder(root1, root2);
};
总结📖
LeetCode 700.二叉搜索树中的搜索
题目链接🔗:700.二叉搜索树中的搜索
解题思路🤔
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
递归法
-
确定递归函数的参数和返回值
- 参数:根节点和要搜索的数值
- 返回值:要搜索的数值所在的节点
-
确定终止条件
root为空或找到这个数值,返回root节点
-
确定单层递归的逻辑
- 如果
root->val > val
,搜索左子树 - 如果
root->val < val
,就搜索右子树 - 如果都没有搜索到,就返回null
- 如果
遇到的问题😢
代码实现👨🏻💻
递归法
var searchBST = function (root, val) {
if (!root || root.val === val) return root;
if (root.val > val) return searchBST(root.left, val);
if (root.val < val) return searchBST(root.right, val);
};
总结📖
LeetCode 98.验证二叉搜索树
题目链接🔗:98.验证二叉搜索树
解题思路🤔
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
在中序遍历下,输出的二叉搜索树节点的数值是有序序列。
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
整体思路:
- 递归中序遍历将二叉搜索树转变成一个数组
- 比较一下这个数组是否是有序的,注意二叉搜索树中不能有重复元素
递归法:
-
确定递归函数的参数和返回值
- 参数:longlong的全局变量(用来比较遍历的节点是否有序)
- 返回值:bool类型的值
-
确定终止条件
空节点,二叉搜索树可以为空
-
确定单层递归的逻辑
中序遍历,一直更新maxVal
,一旦发现maxVal >= root->val
,就返回false
,注意元素相同时候也要返回false
。
遇到的问题😢
代码实现👨🏻💻
递归法
var isValidBST = function (root) {
let arr = [];
const buildArr = (root) => {
if (root) {
buildArr(root.left);
arr.push(root.val);
buildArr(root.right);
}
}
buildArr(root);
for (let i = 1; i < arr.length; ++i) {
if (arr[i] <= arr[i - 1]) return false;
}
return true;
};