一、二叉搜索树的最小绝对差
这里返回值类型用的是void,不用int是因为定义了一个全局变量,用来随时更改保存最小的部分,这个思路我觉得可以沿用到想要返回一个需要不断比较和更新的类型。另外,这题还涉及到了双指针的操作,用于储存上一个节点的地址,让两个地址之间的值可以比较大小。
/**
* 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 {
public:
int minresult=INT_MAX;
TreeNode*pre=nullptr;
void traversal(TreeNode*cur){
if(cur==nullptr)return;
traversal(cur->left);
if(pre!=nullptr){
minresult=min(minresult,cur->val-pre->val);
}
pre=cur;
traversal(cur->right);
}
int getMinimumDifference(TreeNode* root) {
traversal(root);
return minresult;
}
};
二叉搜索树用中序遍历可以得到一个单调递增的数组
二、二叉搜索树众数
依然是想返回一个需要一直更新的数/数组,因此设置一个全局变量,遍历二叉树的函数类型依旧用void。目前做了几个二叉搜索树的题,因为二叉搜索树独特的节点大小按序排列的特点,基本上都用中序遍历。终止条件依旧是遍历到空节点,return。控制单轮循环条件运用了双指针,在cur没有遍历到最底层的叶子节点的时候,先不给pre赋值,然后等到到了最底层开始给pre赋值为cur,达成pre和cur始终保持着相差一个节点的距离的效果。然后,定义count变量,如果cur遇到了新的数(和pre不同)那么就让重新赋值为1,否则就count++。在完成对count的操作之后,再维护maxcount,maxcount的含义是如果节点的节点数达到了maxcount,此时才为众数。如果count==maxcount,也就是说当前cur->val的值达到了要求。可以录入到众数集合中。如果count>maxcount,说明出现了新的击杀王(出现次数更多的val值)。此时需要把原集合的所有元素清空(用到了.clear() 函数 ),然后把众数重新赋到集合中,不要忘记刷新众数记录(把count赋给maxcount)。
/**
* 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 {
public:
TreeNode*pre=nullptr;
int count=0;
int maxcount=0;
vector<int>result;
void traversal(TreeNode*cur){
if(cur==nullptr)return ;
traversal(cur->left);
if(pre==nullptr){
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);
}
traversal(cur->right);
return ;
}
vector<int> findMode(TreeNode* root) {
traversal(root);
return result;
}
};
三、 公共祖先
这题比较的不是val,直接比较pq指针。终止条件是,遍历到空节点root==nullptr时返回root(此时root就是nullptr,写return nullptr也行)或者遍历到pq节点中的一个,开始返回这个节点。本题的思路就是先遍历找到pq的指针,然后向上传递,传递pq指针可以看做一个有效传递,传递空指针可以看做无效传递。当某个节点的左右指针都是有效传递时,即为找到了祖先节点(要及时返回,确保他是最近的节点)
/**
* 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==nullptr)return root;
if(root==p||root==q)return root;
TreeNode*left=lowestCommonAncestor(root->left,p,q);
TreeNode*right=lowestCommonAncestor(root->right,p,q);
if(left!=nullptr&&right!=nullptr)return root;
else if(left!=nullptr&&right==nullptr)return left;
else if(left==nullptr&&right!=nullptr)return right;
else return nullptr;
}
};