题目链接:669. 修剪二叉搜索树
文章讲解:代码随想录
视频讲解:你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili
看完代码随想录之后的想法:
如果节点为空的话,我们返回null;
如果节点的值小于low的话,我们需要删除此节点和此节点的左子树,但是此节点的右子树可能仍然存在小于low的值,因此我们需要递归一下此节点的右子树;
如果节点的值大于high的话,我们需要删除此节点和此节点右子树,但是此节点的左子树仍然可能
存在大于high的值,因此我们需要递归一下此节点的左子树;
我们每次递归返回的值需要有变量接着,递归返回的节点需要我们调用递归之前的节点来接着,这样就可以让节点的左右节点相连了;
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return null;
if(root.val < low) return trimBST(root.right, low, high);
if(root.val > high) return trimBST(root.left, low, high);
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
题目链接: 108.将有序数组转换为二叉搜索树
文章讲解:代码随想录
看完代码随想录之后的想法:
构造二叉树我们使用中序遍历;
终止条件left > right;
1:先构造根节点;
2:递归构造左子树;我们需要接受返回的左子树的根节点;
3:递归构造右子树;我们需要接受返回的右子树的根节点;
class Solution {
TreeNode travesal(int[] nums, int left, int right) {
if(left > right) return null;
int mid = (left + right) / 2;
TreeNode node = new TreeNode(nums[mid]);
node.left = travesal(nums, left, mid - 1);
node.right = travesal(nums, mid + 1, right);
return node;
}
public TreeNode sortedArrayToBST(int[] nums) {
return travesal(nums, 0, nums.length - 1);
}
}
题目链接:538.把二叉搜索树转换为累加树
看完代码随想录之后的想法:
class Solution {
int count = 0;
void tarversal(TreeNode root) {
if(root == null) return ;
tarversal(root.right);
count += root.val;
root.val = count;
tarversal(root.left);
}
public TreeNode convertBST(TreeNode root) {
tarversal(root);
return root;
}
}