二叉搜索树算法题学习

//leetcode700 二叉搜索树中的搜索
TreeNode* searchBST(TreeNode* root, int val) {
	if(root == nullptr || root->val == val)	return root;
	if(root->val > val) return searchBST(root->left,val);
	if(root->val < val) return searchBST(root->right,val);
	return nullptr;
}


//leetcode 669 修剪二叉搜索树
TreeNode* trimBST(TreeNode* root, int low, int high) {
    if(root == nullptr) return root;
    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;
}

//leetcode 538、1038 把二叉搜索树转换成累加树
int sum = 0;
TreeNode* convertBST(TreeNode* root) {
	if(root != nullptr)
	{
		convertBST(root->right);
		sum += root->val;
		root->val = sum;
		convertBST(root->left);
	}
	return root;
}

//leetcode 235 二叉搜索树的最近公共祖先
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        int rootval = root->val;
        int pval = p->val;
        int qval = q->val;
        if(pval > rootval && qval > rootval)
        {
        	return lowestCommonAncestor(root->right,p,q);
		}else if(pval < rootval && qval < rootval)
		{
			return lowestCommonAncestor(root->left,p,q);
		}else
		{
			return root;
		}
} 

//leetcode1373. 二叉搜索子树的最大键值和
class Solution
{
	public:
		int maxSumBST(TreeNode* root)
		{
			int ans = 0;
			dfs(root,&ans);
			return ans;	
		}	
	
	private:
		tuple<int,int,int,bool> dfs(TreeNode* root,int *ans)
		{
			if(!root) return {INT_MAX,INT_MIN,0,true};
			auto [ll,lh,ls,lv] = dfs(root->left,ans);
			auto [rl,rh,rs,rv] = dfs(root->right,ans);
			bool valid = lv && rv && root->val >lh && root->val < rl;
			int sum = valid ? ls + rs + root->val : -1;
			*ans = max(*ans,sum);
			return {min(ll,root->val),max(rh,root->val),sum,valid};
		}
};

//面试04 03 最下高度树
//给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树.
TreeNode* dfs(const vector<int> &nums,int L,int R)
{
	if(L > R)
		return 0;
	int mid = (L + R)>>1;
	auto ptr = new TreeNode(nums[mid]);
	ptr->left = dfs(nums,L,mid-1);
	ptr->right = dfs(nums,mid+1,R);
	return ptr;
}

TreeNode* sortedArrayToBST(vector<int>& nums) {
	return dfs(nums,0,nums.size()-1);
} 


//leetcode270 最接近的二叉搜索树值
//请在该二叉搜索树中找到最接近目标值target的数值。
class Solution270
{
	public:
		int closestValue(TreeNode *root,double target)
		{
			int val,cloest = root->val;
			while(root != nullptr)
			{
				val = root->val;
				cloest = abs(val - target) < abs(cloest - target) ? val : cloest;
				root = target < root->val ? root->left : root->right;
			}	
			return cloest;
		}	
};

posted @ 2020-09-22 17:31  Akmf's_blog  阅读(121)  评论(0编辑  收藏  举报