代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

目录

LeeCode 530.二叉搜索树的最小绝对差

LeeCode 501.二叉搜索树中的众数

LeeCode 236. 二叉树的最近公共祖先


LeeCode 530.二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)

思路1:中序遍历BST得到有序数组,在数组上求两个数的最小差值。

class Solution {
private:
vector vec;
void traversal(TreeNode* root) {
	if (root == NULL) return;
	traversal(root->left);
	vec.push_back(root->val);
	traversal(root->right);
} 
public:
    int getMinimumDifference(TreeNode* root) {
    	vec.clear();
    	traversal(root);
    	if (vec.size() < 2) return 0;
    	int result = INT_MAX;
    	for (int i = 1; i < vec.size(); i++) {
    		result = min(result, vec[i] - vec[i - 1]);
		}
		return result;
    }
};

思路2:二叉树中序遍历的过程中求最小绝对差,需要用一个pre节点记录cur节点的前一个节点。

class Solution {
private:
	int result = INT_MAX;
	TreeNode*  pre = NULL;
	void traversal(TreeNode* cur) {
		if (cur == NULL) return;
		traversal(cur->left);
		if (pre != NULL) {
			result = min(result, cur->val - pre->val);
		}
		pre = cur;
		traversal(cur->right);
	}
public:
    int getMinimumDifference(TreeNode* root) {
    	traversal(root);
		return result;
    }
};

LeeCode 501.二叉搜索树中的众数

501. 二叉搜索树中的众数 - 力扣(LeetCode)

思路:遍历二叉树,每次当前节点和前一个节点作比较,找出最大频率,并将频率等于最大频率的元素加到结果集中,频率大于最大频率时,更新最大频率并且清空结果集。

class Solution {
private:
	int maxCount = 0,count = 0;
	TreeNode* pre = NULL;
	vector result;
	void searchBST(TreeNode* cur) {
		if (cur == NULL) return;
		searchBST(cur->left);
		if (pre == NULL)  count = 1;
		else if (pre->val == cur->val) count++;
        else count = 1;
		pre = cur;
		if (count == maxCount) result.push_back(cur->val);
		if (count > maxCount) {
			maxCount = count;
			result.clear();
			result.push_back(cur->val);
		}
		searchBST(cur->right);
        return;
    }
public:
    vector findMode(TreeNode* root) {
    	count = 0;
    	maxCount = 0;
    	TreeNode* pre = NULL;
    	result.clear();
    	searchBST(root);
    	return result;
    }
};

LeeCode 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

思路:通过后序遍历从底向上遍历,如果 left 和 right 都不为空,说明此时 root 就是最近公共节点。如果 left 为空,right 不为空,就返回 right,说明目标节点是通过 right 返回的,反之亦然。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    	if (root == q || root == p || root == NULL) return root;
    	TreeNode* left = lowestCommonAncestor(root->left, p, q);
    	TreeNode* right = lowestCommonAncestor(root->right, p, q);
    	if (left != NULL && right != NULL) return root;
    	if (left == NULL && right != NULL) return right;
    	else if (left != NULL && right == NULL) return left;
    	else return NULL;
    }
};

你可能感兴趣的:(LeeCode刷题,算法,leetcode,数据结构,c++)