二叉搜索树的最小绝对差:
思路:
递归法:通过中序遍历,可以利用二叉搜索树的性质。此时遍历的值是从小到大的,此时使用两个指针,一个记录前一个结点,一个记录当前结点,然后进行相减,并记录结果
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
int result = INT_MAX;
TreeNode *pre =NULL;
void caozuo(TreeNode * root)
{
if(root == NULL)return;
caozuo(root ->left);
if(pre !=NULL)
{
result = min(result,root->val-pre->val);
}
pre = root;
caozuo(root ->right);
return;
}
public:
int getMinimumDifference(TreeNode* root) {
caozuo(root);
return result;
}
};
遇到的问题:
1.一开始没有想到中序遍历可以利用二叉搜索树的性质
二叉搜索树中的众数:
思路:
递归法:通过中序遍历利用二叉搜索树的性质,统计元素的次数,将前一个结点与当前结点的值比较,如果相等那么次数加一,直到出现不同时判断次数是否大于之前已经查找过的众数的次数,如果是那把结果集清空,加入当前众数,如果相等,那直接加入结果集,如果小于,那么直接略过
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int maxcount =0;
int count=0;
vector<int> result;
TreeNode* pre =NULL;
private:
void caozuo(TreeNode*root)
{
if(root == NULL)
{
return;
}
caozuo(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);
}
caozuo(root->right);
return;
}
public:
vector<int> findMode(TreeNode* root) {
result.clear();
count = 0;
maxcount = 0;
caozuo(root);
return result;
}
};
遇到的问题:
1.对于前一个结点的pre的赋值位置,因为已经提前考虑到遍历的第一个结点没有前一个结点的情况,所以在操作当前结点时,把当前结点赋值为前一结点
二叉树的最近公共祖先:
思路:
1.递归法:因为是查找两个结点的最近公共祖先,也就是最近父节点,所以首先要先能找到两个结点的位置,之后再判断最近公共祖先是谁,所以采用后序遍历,先遍历左右子节点,再处理中间结点
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == p || root == q || 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;
else if(left!=NULL && right ==NULL)return left;
else if(left==NULL && right!=NULL)return right;
else return NULL;
}
};
遇到的问题:
1.对于遍历种类的选择
2.对于返回值的操作:因为只有找到指定的两个结点,返回值才不为空,否则返回值都为空,所以在中间结点处理左右子节点的返回值时,只需要判断两个返回值是否为NULL,就可以确定是否为最近公共祖先