669. 修剪二叉搜索树
思路:理解了删除二叉搜索树中的节点,这个题理解起来就不难了。
还是选用中序遍历递归。
递归三步曲:
1、传入参数:根节点,最小值,最大值;返回值为根节点;
2、终止条件:如果节点为空,直接返回空;
3、递归逻辑:如果最小值小于该节点,递归调用该节点的右孩子(检查右孩子中是否有不符合条件的进行移除)并返回;如果最大值大于该节点,递归调用该节点的左孩子(检查左孩子中是否有不符合条件的进行移除)并返回;用当前节点的左孩子接收递归调用该节点的左孩子;用当前节点的右孩子接收递归调用该节点的右孩子。
移除的逻辑不太好理解,需要多思考
代码如下:
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root==null) return null;
if(root.val<low) return trimBST(root.right,low,high);
if(root.val>high) return trimBST(root.left,low,high);
root.left=trimBST(root.left,low,high);
root.right=trimBST(root.right,low,high);
return root;
}
}
108.将有序数组转换为二叉搜索树
思路:本题的本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。区间仍然是左闭右开区间。
递归三步曲:
1、传入参数:数组,start,end,根节点;返回值为根节点。
2、终止条件:如果start大于等于end说明区间中无节点了,返回null;
3、递归函数逻辑:找到中间节点(start+end)/2+1;建立root;递归调用得到root.left;递归调用得到root.right;返回root。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return arrayToBST(nums,0,nums.length);
}
public TreeNode arrayToBST(int[] nums,int start,int end){
if(start>=end) return null;
int index=(start+end)/2;
TreeNode root=new TreeNode(nums[index]);
root.left=arrayToBST(nums,start,index);
root.right=arrayToBST(nums,index+1,end);
return root;
}
}
538.把二叉搜索树转换为累加树
思路:从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加。定义两个全局变量,一个记录总和的变量,一个指向前一个节点的指针。
递归三步曲:
1、传入参数:传入根节点,返回根节点。
2、终止条件:如果节点为空,返回空。
3、递归函数逻辑:递归调用右孩子;sum加上pre赋值给当前节点,将当前节点的值赋值给pre;递归调用左孩子。
递归代码如下:
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;
}
}
标签:转换,递归,TreeNode,二叉,int,搜索,return,root,节点
From: https://blog.csdn.net/m0_51007517/article/details/142304605