654.最大二叉树
思路:这题就是其实就是找数组中最大的值作为根节点进行构造二叉树。构造二叉树我们用前序遍历是最好的。这里我们定义一个方法,把数组以及它们的下标传入(下表是为了方便后面进行数组分割)。终止条件就是数组中只有一个元素的时候,直接构建这一个元素的树返回即可。然后我们设定要给index和value,index用于存储最大值的下标,value用于存储最大值。找到最大值后,先构造为树,然后再把这个树的左右节点构造(即通过index分割该数组进行构造左右子树),最后返回root即可
代码:
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return constructMaximumBinaryTree1(nums, 0, nums.length);
}
public TreeNode constructMaximumBinaryTree1(int[] nums, int leftIndex, int rightIndex) {
if (rightIndex - leftIndex < 1) {// 没有元素退出
return null;
}
if (rightIndex - leftIndex == 1) {// 只有一个元素,直接构造
return new TreeNode(nums[leftIndex]);
}
int maxIndex = leftIndex;// 最大值所在位置
int maxVal = nums[maxIndex];// 存储最大值
for (int i = leftIndex + 1; i < rightIndex; i++) {
if (nums[i] > maxVal){
maxVal = nums[i];
maxIndex = i;
}
}
TreeNode root = new TreeNode(maxVal);
// 根据Index划分左右子树
root.left = constructMaximumBinaryTree1(nums, leftIndex, maxIndex);
root.right = constructMaximumBinaryTree1(nums, maxIndex + 1, rightIndex);
return root;
}
}
617.合并二叉树
思路:这题其实就是把两个二叉树对应位置上的数值相加成为一个新的节点,若其中一个位置空的,另一个位置不为空,则直接返回不为空的那个树的节点即可。终止条件就是其中一个二叉树的节点为空,另一个二叉树不为空。若不满足终止条件,就把两个二叉树节点值相加,成为一个新的节点。然后再继续遍历这两个二叉树的左右节点(新节点的左右子树去接收这个方法调用)
代码:
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null) return root2;
if (root2 == null) return root1;
root1.val += root2.val;
root1.left = mergeTrees(root1.left,root2.left);
root1.right = mergeTrees(root1.right,root2.right);
return root1;
}
}
700.二叉搜索树中的搜索
思路:这道题目其实就是让我们利用二叉搜索树的特性来实现的。这里首先判断当前节点是否为空或者判断当前节点值是否等于val,如果是则直接返回root。如果当前节点值大于val,就继续遍历当前节点的左子树,如果当前节点值小于val,则继续遍历当前节点右子树
代码:
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) {
return root;
}
if (val < root.val) {
return searchBST(root.left, val);
} else {
return searchBST(root.right, val);
}
}
98.验证二叉搜索树
思路:其实这题的思路就是利用中序遍历的方式,把树中所有的值都遍历出来,看看它是否有序,若前一个节点值大于当前节点值,就表示不是递增有序的,就直接返回false即可。这里设置的pre就是用于存储前一个节点的值的
代码:
class Solution {
private long prev = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (!isValidBST(root.left)) {
return false;
}
if (root.val <= prev) { // 当前一个节点的值大于当前节点值时,表示不符合二叉搜索树的性质,所以返回false
return false;
}
prev = root.val;
return isValidBST(root.right);
}
}