您现在的位置是:首页 >技术杂谈 >代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树网站首页技术杂谈
代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
简介代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
目录
669. 修剪二叉搜索树
这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。
题目链接/文章讲解: 代码随想录
题解思路:
多听卡哥视频讲解思路!!!自己肯定想不出来这么清晰的思路,然后多看把思路记在心里就好!!!!本题注意的是:根据二叉搜索树的特性,当节点的值小于low值时,需要对右子树的节点进行判断;当节点的值大于high值时,需要对左子树的节点进行判断!!!然后就是代码会一直对不符合区间的节点进行处理,如果遇到的节点符合区间值,最后也会一直遍历到root值为null值时,返回null值结束的。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return null;
//中:节点的值小于low值考虑右子树
if(root.val < low){ //如果遍历的节点值小于最小值,根据二叉搜索树的特性,则其左子树一定会小于最小值,直接考虑右子树的节点值是否有大于最小值的节点
TreeNode right = trimBST(root.right,low,high); //
return right; //如果右子树上的所有节点也不满足区间内的值,则最后是以遍历到右子树的root为null值时,最终也会返回null值的
}
//中:节点的值大于high值考虑左子树
if(root.val > high){ //如果遍历的节点大于最大值,根据二叉搜索树的特性,则其右子树一定会大于最大值,直接考虑左子树的节点值是否小于最大值的节点
TreeNode left = trimBST(root.left,low,high);
return left; //如果左子树上的所有节点也不满足区间内的值,则最后也是以遍历左子树的root为null值时,最终也会返回null值
}
root.left = trimBST(root.left,low,high);//左 当遍历的节点符合区间值会一直遍历下去,直到遍历的节点root为null值时,也会也会null值
root.right = trimBST(root.right,low,high);//右 当遍历的节点符合区间值会一直遍历下去,直到遍历的节点root为null值时,也会也会null值
return root;
}
}
108.将有序数组转换为二叉搜索树
本题就简单一些,可以尝试先自己做做。
题目链接/文章讲解:代码随想录
题解思路:
多听卡哥思路讲解!!!本题关键在于不断的平等的分割左右数组,然后构建二叉树,这样基于分割后的数组构建的二叉树一定是平衡二叉树,而所给的数组已经是排好序的数组了,那么基于此数组构建的一定是二叉搜索树,所以一开始拿到题目不用很慌,觉得很难题解!!!一定要多看卡哥视频,多听,多看,多想,多刷就好!!!还有就是编写代码时一定要确定好(比如左闭右闭)原则去进行分析,否则分析的时候会很混乱的
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums, 0, nums.length - 1);
}
//左闭右闭原则
public TreeNode sortedArrayToBST(int[] nums, int begin, int end){
if(begin > end) return null;
int middle = (end - begin)/2 + begin;
TreeNode root = new TreeNode(nums[middle]);
root.left = sortedArrayToBST(nums, begin, middle -1);
root.right = sortedArrayToBST(nums, middle + 1, end);
return root;
}
}
538.把二叉搜索树转换为累加树
本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。
题目链接/文章讲解:代码随想录
题解思路:
看题解好简单,自己写一团糟,不知道为什么会这样!!!就是说自己想的牛头不对马嘴就很离谱了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if(root == null) return null;
convertBST(root.right);
sum += root.val;
root.val = sum;
convertBST(root.left);
return root;
}
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。