代码随想录 (programmercarl.com)
669. 修剪二叉搜索树
108.将有序数组转换为二叉搜索树
注意:int mid = nums.length / 2;错误的原因是mid需要随着遍历递归改变,不是固定不变的。
int mid = (left + right) / 2;也可以的,数组下标不会报内存。
定义为左闭右闭区间
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
int left = 0;
int right = nums.length - 1;
return traversal(nums, left, right);
}
public TreeNode traversal(int[] nums, int left, int right) {
if (left > right){
return null;
}
// int mid = nums.length / 2; //错误
int mid = left + ((right - left) / 2);
TreeNode root = new TreeNode(nums[mid]);
root.left = traversal(nums, left, mid -1);
root.right = traversal(nums, mid + 1, right);
return root;
}
}
538.把二叉搜索树转换为累加树
后序遍历---右中左遍历顺序,找到大于等于该节点的数值。
双指针法:类似之前的求二叉搜索树最小绝对值差、求二叉搜索树的众数。
二叉树题目的难点在于二叉树的遍历
int pre = 0;的位置很关键,应该放在循环体的外面,不需要每次进递归都设为0,这样无法累加。
class Solution {
public TreeNode convertBST(TreeNode root) {
traversal(root);
return root;
}
int pre = 0;
public void traversal(TreeNode cur){
if (cur == null){
return;
}
traversal(cur.right);//右
cur.val += pre;//中
pre = cur.val;
traversal(cur.left);//左
}
}