给你二叉搜索树的根节点 root
,同时给定最小边界low
和最大边界 high
。通过修剪二叉搜索树,使得所有节点的值在[low, high]
中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
示例 1:
输入:root = [1,0,2], low = 1, high = 2 输出:[1,null,2]
示例 2:
输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3 输出:[3,2,null,1]
提示:
- 树中节点数在范围
[1, 104]
内 0 <= Node.val <= 104
- 树中每个节点的值都是 唯一 的
- 题目数据保证输入是一棵有效的二叉搜索树
0 <= low <= high <= 104
思路:
递归三部曲:
1.确定返回值和参数类型
因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。
但是有返回值,更方便,可以通过递归函数的返回值来移除节点。
2.确定递归结束条件:
遇到空结点返回
3.确定单层递归逻辑:
root.val<low:右子树可能存在满足要求的值,将修建后的右子树返回
root.val>high:左子树可能存在满足要求的值,将修剪后的左子树返回
low<=root.val<=high:左右子树都可能存在满足要求的值,修建左右子树,返回root
代码参考:
/**
* 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 cur, int low, int high) {
if(cur == null)
return null;
if(cur.val>high) return trimBST(cur.left,low,high);
if(cur.val<low) return trimBST(cur.right,low,high);
cur.left=trimBST(cur.left,low,high);
cur.right=trimBST(cur.right,low,high);
return cur;
}
}
给你一个整数数组 nums
,其中元素已经按 升序 排列,请你将其转换为一棵
平衡
二叉搜索树。
示例 1:
输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3] 输出:[3,1] 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
按 严格递增 顺序排列
思路:
将数组中间位置的数构建成新结点,将该数组一分为二构造左子树和右子树
/**
* 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) {
if(nums.length==0){
return null;
}
Arrays.sort(nums);
int mid=nums.length/2;
int[] left= Arrays.copyOfRange(nums,0,mid);
int[] right = Arrays.copyOfRange(nums,mid+1,nums.length);
TreeNode left_tree=sortedArrayToBST(left);
TreeNode right_tree = sortedArrayToBST(right);
return new TreeNode(nums[mid],left_tree,right_tree);
}
}
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node
的新值等于原树中大于或等于 node.val
的值之和。
提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
注意:本题和 1038: . - 力扣(LeetCode) 相同
示例 1:
输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
示例 2:
输入:root = [0,null,1] 输出:[1,null,1]
示例 3:
输入:root = [1,0,2] 输出:[3,3,2]
示例 4:
输入:root = [3,2,4,1] 输出:[7,9,4,10]
提示:
- 树中的节点数介于
0
和104
之间。 - 每个节点的值介于
-104
和104
之间。 - 树中的所有值 互不相同 。
- 给定的树为二叉搜索树。
思路:
中序遍历二叉搜索树能得到一串递增的数字,本题采用右中左遍历,用两个指针一个指向当前结点一个指向前一节点实现累计效果
递归三部曲:
1.返回值和参数类型
不需要递归函数的返回值做什么操作了,要遍历整棵树。
2.确定结束条件
遇空就终止。
3.单层递归逻辑
要右中左来遍历二叉树, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。
/**
* 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 {
TreeNode pre =null;
public TreeNode convertBST(TreeNode root) {
travel(root);
return root;
}
public void travel(TreeNode cur){
if(cur==null)
return ;
travel(cur.right);
if(pre!=null){
cur.val+=pre.val;
}
pre=cur;
travel(cur.left);
}
}