669. 修剪二叉搜索树
- 669. 修剪二叉搜索树 | 题目链接
- 代码随想录 | 讲解链接
- 题意:给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点
- 思路:利用二叉搜索树性质。见代码分析
/**
* 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;
}
//节点比high大同理。
if(root.val > high) {
TreeNode left = trimBST(root.left, low, high);
return left;
}
//左右子树遍历
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
108.将有序数组转换为二叉搜索树
-
题意:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
-
思路:找到数组中的中间元素为根节点,左边的元素构造左子树,右边构造右子树。
/**
* 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 trvasal(nums, 0, nums.length - 1);
}
public TreeNode trvasal(int[] nums, int left, int right) {
//终止条件,定义区间为左闭右闭,所以当下标left > right时才终止
if(left > right) {
return null;
}
//找到区间内的中间元素
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
//把mid左右两侧的元素分别给左右子树
root.left = trvasal(nums, left, mid - 1); //左闭右闭,所以是mid-1
root.right = trvasal(nums, mid + 1, right); //左闭右闭,所以是mid+1
return root;
}
}
538.把二叉搜索树转换为累加树
- 538.把二叉搜索树转换为累加树 | 题目链接
- 代码随想录 | 讲解链接
- 题意:给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
- 思路:二叉搜索树有特性,左中右遍历时元素从小到大排序,那右中左遍历时就是从大到小排序,利用双指针,此时就可以把前一个结点的值加到后一个节点上,这样就实现了累加的效果。
/**
* 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 pre = 0;
public TreeNode convertBST(TreeNode root) {
if(root == null) {
return null;
}
convertBST(root.right);
root.val += pre;
pre = root.val;
convertBST(root.left);
return root;
}
}