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

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;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容