530.二叉搜索树的最小绝对差
思路:
类似第98题:验证二叉搜索树,中序遍历能有序遍历,相邻元素即为差最小
1. 用中序遍历遍历树得到有序数组,用一个数组记录树的元素,再对数组按顺序找到最小的绝对差
2.用temp记录差值,用pre记录前一个节点。
终止条件:if(root==NULL) return temp;
左:(右同理)
int left=getMinimumDifference(root->left);
中:
if(pre!=NULL && root->val-pre->val<temp)
temp=root->val-pre->val;
pre=root;
最后返回min(left,right)
看视频后:
result=min(result,cur->val-pre->val);//可以用min函数获取两者间更小值
501.二叉搜索树中的众数
思路:
中序遍历,用unordered_map记录元素和其出现次数,将map转成vector<pair<int,int>>,对vector根据第二个元素进行排序,将vector中的与第一个次数相同的放入vector result数组,返回result。但我在排序中快排一直出问题。
看视频后:
1.用两轮遍历,第一轮记录最大出现次数,第二轮记录等于最大出现次数的元素
2.只遍历一遍的小技巧:
相等的时候放进去,如果出现更大的就清空原来的result,再放进去新的。
if(maxcount==count)
result.push_back(root->val);
if(count>maxcount)
{
maxcount=count;
result.clear();
result.push_back(root->val);
}
236. 二叉树的最近公共祖先
思路:
感觉是左右中的后序遍历,将左右是否有需要的元素信息返回给中间节点
看视频后:
遍历顺序:后序(左右中)
停止条件:
if(root==NULL||root==p||root==q)return root;
中:
if(left!=NULL && right!=NULL)
return root;
if(left!=NULL && right==NULL)
return left;
else if(left==NULL && right!=NULL)
return right;
else
return NULL;