题目:669. 修剪二叉搜索树 - 力扣(LeetCode)
思路/想法:
前序遍历。中的处理逻辑:当前节点值小于较小值时,向其右子树进行递归遍历,当前节点值大于较大值时,向其左子树进行遍历。左右进行递归遍历,返回root即可。
代码实现:
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. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
思路/想法:
构造二叉树,前序遍历
代码实现:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
// 高度平衡二叉搜索树(左右子树高度差小于等于1)
// 中序遍历
TreeNode root = sortedArrayToBST(nums, 0, nums.length);
return root;
}
private TreeNode sortedArrayToBST(int[] nums, int left, int right) {
if (left >= right) return null;
if (right - left == 1) {
return new TreeNode(nums[left]);
}
// [0,1,2,3,4,5] [0,1,2,3]
// int mid = (right + left) / 2; // 存在内存溢出的情况
int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, left, mid);
root.right = sortedArrayToBST(nums, mid + 1, right);
return root;
}
}
题目:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
思路/想法:
非纯粹的中序遍历,中序的镜像。
代码实现:
class Solution {
int sum;
public TreeNode convertBST(TreeNode root) {
sum = 0;
traversal(root);
return root;
}
private void traversal(TreeNode root) {
// 遍历顺序:右 中 左
// 终止条件
if (root == null) return;
traversal(root.right); // 右
// 中
sum += root.val;
root.val = sum;
traversal(root.left); // 左
}
}