669. 修剪二叉搜索树
分析:首先确定遍历顺序为中左右的前序遍历,对于中间节点,如果其值不在[low, high]的范围内,那么是需要修剪的节点,如果root.val < low,那么就需要一个大于root.val的节点来代替当前节点,所以需要向右遍历,并返回。同理,当root.val > high,向左遍历。最后遍历左右子树即可。
代码:
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null){
return null;
}
if(root.val < low){
return trimBST(root.right, low, high);
}else 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. 将有序数组转换为二叉搜索树
分析:对于有序数组,中间的mid节点一定是跟节点,因此每次遍历时,先处理mid节点,第二步需要递归处理由mid分割的左右节点,分别用root.left和root.right接收,最后返回根节点即可。
代码:
public TreeNode sortedArrayToBST(int[] nums) {
return traversal(nums, 0, nums.length - 1);
}
private TreeNode traversal(int[] nums, int left, int right){
if(left > right){
return null;
}
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = traversal(nums, left, mid - 1);
root.right = traversal(nums, mid + 1, right);
return root;
}
538. 把二叉搜索树转换为累加树
分析:考虑到二叉树搜索树中序遍历是一个单调递增的数组,那么右中左遍历就是一个单调递减数组,既然题目含义是只加上大于等于当前节点的数值,那么设置一个pre记录前一个节点的值,然后采用右中左的遍历顺序遍历即可。
代码:
private int pre = 0;
public TreeNode convertBST(TreeNode root) {
traversal(root);
return root;
}
private void traversal(TreeNode node){
if(node == null){
return;
}
traversal(node.right);
node.val += pre;
pre = node.val;
traversal(node.left);
}