当遇到比下边界小的值,应该递归修改右子树
当遇到比上边界大的值,应该递归修改左子树
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int):
if not root:
return root
if root.val < low:
return self.trimBST(root.right, low, high)
if root.val > high:
return self.trimBST(root.left, low, high)
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
return root
将有序数组的中点当做数的根节点,不断递归左右子区间
这样构建出来的左右子树一定是平衡的
class Solution:
def sortedArrayToBST(self, nums: List[int]):
return self.dfs(nums, 0, len(nums) - 1)
def dfs(self, nums, left, right):
if left > right:
return None
mid = left + (right - left) // 2
mid_root = TreeNode(nums[mid])
mid_root.left = self.dfs(nums, left, mid - 1)
mid_root.right = self.dfs(nums, mid + 1, right)
return mid_root
采用右中左的遍历顺序
维护一个全局变量sum,记录遍历过的节点值和,并修改遍历到的节点值
class Solution {
public:
int sum = 0;
void dfs(TreeNode* node) {
if (node == nullptr) return;
dfs(node->right);
sum += node->val;
node->val = sum;
dfs(node->left);
}
TreeNode* convertBST(TreeNode* root) {
dfs(root);
return root;
}
};
依然参考十进制转二进制的思路,用短除法进行负二进制转换
class Solution:
def baseNeg2(self, n: int):
res = ''
while n:
n, k = -(n // 2), n % 2
res = str(k) + res
return res if res else '0'