538.把二叉搜索树转换为累加树
反向中序遍历进行处理就可以了,设置全局参数sum,每遍历到一个新的节点,用sum和它相加,之后更新sum的值。
class Solution {
public:
int sum=0;
void digui(TreeNode* root)
{
if(root==nullptr)return ;
digui(root->right);
int cur=root->val;
root->val+=sum;
sum+=cur;
digui(root->left);
return;
}
TreeNode* convertBST(TreeNode* root) {
sum=0;
digui(root);
return root;
}
};
669. 修剪二叉搜索树
主要还是删除节点的思路,尽可能的不改变原来树的结构
1.当前节点大于high,接收当前节点的左节点递归得到的信息并返回。
2.当前节点小于low,接收当前节点的右节点递归得到的信息并返回。
class Solution {
public:
TreeNode* digui(TreeNode* root, int low, int high)
{
if(root==nullptr)return root;
if(root->val>high)
{
auto left=digui(root->left,low,high);
return left;
}
if(root->val<low)
{
auto right=digui(root->right,low,high);
return right;
}root->left=digui(root->left,low,high);
root->right=digui(root->right,low,high);
return root;
}
TreeNode* trimBST(TreeNode* root, int low, int high) {
return digui(root,low,high);
}
};
模拟实例(节点范围是1-3)
1. 3进入递归函数,此时root=3节点的指针(以下简称3,用节点的值代指节点),3在[1,3]内,不会进入if。
进入root->left=digui(root->left,low,high);代码执行,root->left此时为0;
2. 0进入函数,此时root=0,0<1,进入
if(root->val<low)
{
auto right=digui(root->right,low,high);
return right;
}
此时root->right=2,2进入递归
3. 此时root=2,因为2满足[1,3],执行
root->left=digui(root->left,low,high);
root->right=digui(root->right,low,high);
return root;
因为2的右节点为空,所以root->right=null,root->left=1满足[1,3],所以直接返回1
当3.节执行结束后,返回root(2),此时root->right==null,root->left==1;
回到2.节auto right=digui(root->right,low,high);的执行,3.节返回的root(2)被right所接受,返回right,
回到1.节root->left=digui(root->left,low,high)的执行,此时root=3,digui(root->left,low,high)返回的是节点2,此时3的左节点改为了2,0的删除结束。
总结来说,删除节点是直接把节点的子节点和节点的父节点直接相连。
108.将有序数组转换为二叉搜索树
还是拆分区间的思路,先取区间中点,利用中点值新建节点,利用中点值更新区间,进行递归。
注意两个条件1.这里是左闭右闭区间,所以begin>end时循环结束。
2.因为是左闭右闭,所以区间之间不能有交集
分割为[begin,mid-1],mid,[mid+1,end]三部分,其中中间部分已经赋值过了,所以下次递归不需要带上。
class Solution {
public:
TreeNode* sorted(vector<int>& nums,int begin,int end)
{
if(begin>end)return nullptr;
int mid=(end-begin)/2+begin;
TreeNode*root=new TreeNode (nums[mid]);
root->left=sorted(nums,begin,mid-1);
root->right=sorted(nums,mid+1,end);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
int begin=0;
int end =nums.size()-1;
return sorted(nums,begin,end);
}
};