530.二叉搜索树的最小绝对差
思路:跟上一题一样,利用双指针,定义一个pre指针,遍历二叉树,中序遍历(二叉搜索树是有序的,用中序遍历是递增),如果前一个节点与后一个结点的差值大于最小差,就替代,遍历结束后返回最小绝对差。
class Solution {
public:
TreeNode* pre=NULL;
int min_value = INT_MAX;
int getMinimumDifference(TreeNode* root) {
if(root==NULL)
{
return min_value;
}
getMinimumDifference(root->left);
if(pre!=NULL)
{
if(abs(pre->val-root->val)<min_value)
{
min_value = abs(pre->val-root->val);
}
}
pre=root;
getMinimumDifference(root->right);
return min_value;
}
};
501.二叉搜索树的众数
思路:二叉搜索树中可能包含多个众数,仍利用双指针,定义pre指针,也需要定义计数的count,以及最大众数maxcount,当count==maxcount时,说明发现众数,就把这个结点的值存入result,如果count大于了当前的maxcount,就更新maxcount的值,然后清空result,将当前结点的值重新加入result。
class Solution {
public:
TreeNode* pre=NULL;
int count = 0;
int maxcount = 0;
vector<int> result;
void traversal(TreeNode*root)
{
if(root==NULL)
{
return;
}
traversal(root->left);
if(pre==NULL)
{
count= 1;
}
else if(pre->val==root->val)
{
count++;
}
else
{
count = 1;
}
pre =root;
if(count == maxcount)
{
result.push_back(root->val);
}
if(count > maxcount)
{
maxcount = count;
result.clear();
result.push_back(root->val);
}
traversal(root->right);
return;
}
vector<int> findMode(TreeNode* root) {
traversal(root);
return result;
}
};
236.二叉树的最近公共祖先
思路:后序遍历,因为需要中结点判断左右子树是否包含p,q,所以必须用后续遍历。递归终止条件,如果当前结点为NULL,返回NULL。如果当前结点为p或q,返回当前结点,中间结点判断左右结点的值,如果都为NULL,返回NULL,哪个不为空返回哪个,如果都不为空,返回当前结点。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//终止条件
if(root==NULL)
{
return root;
}
if(root==p||root==q)
{
return root;
}
TreeNode* left_node = lowestCommonAncestor(root->left,p,q);
TreeNode* right_node = lowestCommonAncestor(root->right,p,q);
if(left_node!=NULL &&right_node==NULL)
{
return left_node;
}
else if(left_node==NULL&&right_node!=NULL)
{
return right_node;
}
else if(left_node!=NULL&& right_node!=NULL)
{
return root;
}
else
{
return NULL;
}
}
};
收获:
需要中间结点对左右结点进行判断时要用后序遍历。
二叉搜索树一般用中序遍历,遍历的结果,元素是递增的。