LeetCode 669修剪二叉搜索树
题目简析:
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构
思路分析:代码过程以669的示例2来解释了,内容见注释即可
使用有返回值的会比较好,抓住下面几个点,保持结构,可能会有重构情况,跟直接删除还有点类似,当前结点若不符合范围,小于区间最小,那就放入当前结点的右子树的结点,大于区间最大,放入左子树
//涉及到结点的左右子树重构的问题
//以示例2作为例子:
//删0之后直接把右子树赋值给3的左位置即可
public TreeNode trimBST(TreeNode root, int low, int high) {
return dfs(root,low,high);
}
public TreeNode dfs(TreeNode root, int low, int high){
//终止条件:空返回
if(root == null){
return null;
}
//找不在区间里的结点
//当前值小于左区间,就放入右结点
//这个就是示例2中
//假如当前结点是0,那就把0的右子树的位置补上来
// 等递归结束后,3的左就是2
if(root.val < low){
return dfs(root.right, low, high);
}
//当前值大于有区间,就放入左结点
if(root.val > high){
return dfs(root.left,low,high);
}
//找在区间里的结点,进行重构
root.left = dfs(root.left,low,high);
root.right = dfs(root.right, low, high);
return root;
}
LeetCode 108将有序数组转换为二叉搜索树
题目简析:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
思路分析:
//因为已经排好序了,即左小右大,满足二叉搜索树的特点 //因此只需要找中间点传入,然后判断一下是否符合平衡二叉树
new根点后找左右结点等递归即可
public TreeNode sortedArrayToBST(int[] nums) {
//因为已经排好序了,即左小右大,满足二叉搜索树的特点
//因此只需要找中间点传入,然后判断一下是否符合平衡二叉树
return sort(nums,0, nums.length);
}
public TreeNode sort(int[]nums,int left,int right){
//交叉/相等
if(left>=right){
return null;
}
if(right-left==1){
return new TreeNode(nums[left]);
}
//防溢出
int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = sort(nums,left,mid);
root.right = sort(nums,mid+1,right);
return root;
}
LeetCode 538把二叉搜索树转换为累加树
题目简析:
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
思路分析:常规题,巧思在先从最右边开始去进入递归,然后通过一个sum来记录结点值,不断返回,使用sum来累加
int sum = 0;
public TreeNode convertBST(TreeNode root) {
//二叉搜索树,右结点大于左结点
//所以从右边开始
//因为每个节点 node 的新值等于原树中大于或等于 node.val 的值之和
//所以直接从最右边开始往回找
if(root == null){
return null;
}
convertBST(root.right);
root.val += sum;
sum = root.val;
convertBST(root.left);
return root;
}