669. 修剪二叉搜索树
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
//终止条件
if (root == nullptr) return nullptr;
//如果当前节点不符合条件
if (root->val > high) { //那就向左遍历
return trimBST(root->left, low, high);
}
if (root->val < low) { //那就向右遍历
return trimBST(root->right, low, high);
}
//如果当前节点符合条件
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
108.将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
例如:输入:[-10,-3,0,5,9]
如下两棵树,都是这个数组的平衡二叉搜索树:
class Solution {
public:
/*
整体思路依旧是分割数组
因为数组是有序的,找到数组中的中间值(如果是偶数个取左取右都可以)
中间值作为头节点
然后左右数组分别递归,成为左孩子和右孩子
但是在分割的时候注意,完全可以用左右下标来分割数组,要比重新创建简洁很多
*/
TreeNode* traversal(vector<int>& nums,int left,int right) {
//终止条件
if (left > right) return nullptr;
//单层逻辑
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;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums, 0, nums.size() - 1);
return root;
}
};
538.把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。
输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
**思路:
这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]**从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。
class Solution {
public:
/* 反中序遍历 因为一个加上来的是最右边的值 所以是 右 中 左 */
int pre;
void traversal(TreeNode* cur) {
if (cur == nullptr) return ;
traversal(cur->right);//右
//中
cur->val += pre;
pre = cur->val;
traversal(cur->left);//左
}
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};