修剪二叉树
看完题的思路
对于【l,h】区间,首先找到大于等于l的第一个节点,删除其左子树,找到小于等于h的节点,删除其右子树。
错误:删除的节点是1.5,上面还有一个1,怎么办?而且上面还有一个0,0无论如何使找不到的
(1)如何找到该节点
例如要删除的节点为【1.5,x】,需要找到节点
思路
正解 使用递归
node f(root) 含义 删除之后返回的根节点
(1) node f(root), 全局pre
(2)递归终止条件
if(root==null){
return null;
}
(3)if(root.val<l){
删除其左树,即不遍历左树,
return f(右树); // 该节点小于l,但是从其右子树找到了比l大的
}
right同理
// 如果符合条件
root.left=f(root.left);
root.right=f(root.right)
return root;
代码
/*
* 递归函数的含义:修剪完成返回的值
* */
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root==null){ // 为空,修剪完也为空,返回空
return null;
}
if (root.val<low){
// 左子树一定小于low 不去遍历,等于删除,右子树可能有大于等于low的,遍历,返回修剪后的右子树根节点
return trimBST(root.right,low,high);
}
if (root.val>high){
return trimBST(root.left,low,high);
}
// 如果该节点正好位于[l,h]内,遍历左右节点
root.left=trimBST(root.left,low,high);
root.right=trimBST(root.right,low,high);
return root;
}
复杂度
收获
- 迭代法三刷再写
- 三刷本题看一遍
108.将有序数组转换为二叉搜索树
看完题后的思路
对于有序数组,把中间节点作为根节点,递归左边部与右半部分别为左子树为右子树,返回根节点.
代码
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums,0,nums.length);
}
public TreeNode sortedArrayToBST(int[] nums,int low,int hight) {
if (low==hight){
return null;
}
int mid=low+((hight-low)>>1);
int midVal=nums[mid];
TreeNode root = new TreeNode(midVal);
TreeNode left = sortedArrayToBST(nums, low, mid);
TreeNode right = sortedArrayToBST(nums, mid+1, hight);
root.left=left;
root.right= right;
return root;
}
复杂度
收获
三刷 过
538.把二叉搜索树转换为累加树
看完题后的思路
逆中序遍历,初始sum=0,每遍历一个节点,sum+=该节点值,该节点值=sum
代码
int convertBSTSum=0;
public TreeNode convertBST(TreeNode root) {
convertBSTDG(root);
return root;
}
public void convertBSTDG(TreeNode root) {
if (root==null){
return;
}
convertBSTDG(root.right);
convertBSTSum+=root.val;
root.val=convertBSTSum;
convertBSTDG(root.left);
}
复杂度
收获
三刷过