!!!!成功有两个秘诀,一个是坚持到底,一个是永不放弃!!!
669. 修剪二叉搜索树
输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]
思路:BST的特性判断范围
如果当前节点node的val小于左值,说明要向node->right(BST特性)寻找节点。
同理 node的val大于右值,说明要向node->left(BST特性,node->left的值小于node->val)寻找节点
一层一层向上返回
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==NULL) return root;//(寻找空节点,向上返回空)
if(root->val > high)//值比high大,向left递归查找
{
TreeNode* temp = trimBST(root->left,low,high);
return temp;
}
if(root->val < low)//值比low小,向right递归查找
{
TreeNode* temp =trimBST(root->right,low,high);
return temp;
}
root->left=trimBST(root->left,low,high);//节点向左子树搜索符合条件的情况
root->right=trimBST(root->right,low,high);//同理,右搜索
return root;
}
};
108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 的二叉树。
class Solution {
private:
TreeNode* get(vector<int>& nums,int left, int right)
{
if(left > right) return NULL;
int mid=left+(right-left)/2;//二分??//mid=(left+right)/2
TreeNode* root= new TreeNode(nums[mid]);
root->left=get(nums,left,mid-1);
root->right=get(nums,mid+1,right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
//return get(nums,0,nums.size()-1); 得到root,但是你没有在main中定义
TreeNode* root=get(nums,0,nums.size()-1);
return root;
}
};
538. 把二叉搜索树转换为累加树
累加树的定义为树中的一个节点的值为原先树所有大于这个节点值加本身的和
而BST有特性,节点的右节点的值是大于这个节点的值,所以采用 右 根 左 遍历方式
class Solution {
private:
int cur=0;
void NewTree(TreeNode* root)//在原有基础上改造BST二叉,所以是void类型
{
if(root==NULL) return;//不能返回上一个节点NULL,因为这里没有删除二叉,改造二叉!!!!==坏习惯!!!
NewTree(root->right);//右逻辑
//中
root->val+=cur;//此时root为树最右节点,依次向上返回
cur=root->val;//让cur值为当前节点的值,为下一次做准备
//中处理逻辑双指针!
NewTree(root->left);//左逻辑
}
public:
TreeNode* convertBST(TreeNode* root) {
NewTree(root);
return root;
}
};