669.修剪二叉搜索树
解题思路:
因为本题是二叉搜索树,所以我们要充分利用二叉树的特性,本题仍然使用递归的方法,本级递归我们要将结果返回给本级的上级,在遍历的当前节点的值小于区间的最低界限时,再往下遍历的时候就可以只便利他的右子树,因为所有左子树的结点一定小于最低界限。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == NULL) return NULL;
if(root->val < low){//如果当前节点的值小于区间最小值,那么他的左子树一定都小于low,就只遍历他的右子树就可以了
TreeNode* left = trimBST(root->right,low,high);
return left;
}
if(root->val > high){
TreeNode* right = trimBST(root->left,low,high);
return right;
}
root->left = trimBST(root->left,low,high);
root->right = trimBST(root->right,low,high);
return root;
}
};
108.将有序数组转化为二叉搜索树
108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
解题思路:
一个有序数组构造二叉搜索树是非常简单的我们可以直接构造成一个仅有右子树的链式二叉搜索树,但是本题给我们添加了一个条件就是构造成的二叉树搜索树还要是平衡二叉树。
平衡二叉树的话就要考虑左右子树的高度问题了,我们可以尽可能的去让左右子树的高度相同,因为他给的数组是有序的,在本级递归中我们可以取数组的中间值作为根节点,左边的构造左子树,右边的构造右子树。关于数组的长度的奇偶问题不用管,因为如果是偶数的话中间值有两个,那么取左边的还是右边的最后结果只是二叉树的结构不同,不会影响什么。
具体代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//双指针的方式,区间为左闭右闭
TreeNode* traversal(vector<int>& nums,int left,int right){
if(left > right){
return NULL;
}
int mid = (left + right) / 2;//这里不用担心会爆栈,因为left和right代表的是数组
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) {
return traversal(nums,0,nums.size() - 1);
}
};
538.将二叉搜索树转化为累加树
538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
解题思路:
依然是利用二叉搜索树的特性,但唯一不同的是遍历顺序变成了倒序遍历。因为是从最大的数字开始累加的,最大的数在右边。
具体代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//因为是从最大的数开始累加的,所以要从右向左去遍历,边遍历边累加。
int pre = 0;
void traversal(TreeNode* cur){
if(cur == NULL) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;//pre是一个整型,不是一个指针,在本题它主要通过一个记录cur数值的方式,来保持pre指向cur的前一个。
traversal(cur->left);
}
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};