二叉树探索篇Ⅳ

Leetcode530——二叉搜索树的最小绝对差

题目描述:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1

算法思想:

利用二叉搜索树中序遍历是个升序数组的特性,记录下升序遍历中前后两个节点差的最小值。

算法实现:

TreeNode *pre=nullptr;
    int mindif=INT_MAX;
    void travel(TreeNode* node){
        if(node==nullptr) return;
        travel(node->left);
        if(pre) mindif=min(mindif,node->val-pre->val);
        pre=node;
        travel(node->right);
        return;
    }
    int getMinimumDifference(TreeNode* root) {
        travel(root);
        return mindif;
    }

Leetcode501——二叉搜索树中的众数

题目描述:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

输入:root = [1,null,2,2]
输出:[2]

算法思想:

遍历出所有的节点并保存到图中,图记录所有关键字出现的频率。最后在图中找到频率最大的加入到结果集中。(笨方法,并没有利用到二叉搜索树的特性,适用于随便一棵二叉树)

算法实现:

unordered_map<int,int> mulmap;
    void intraverse(TreeNode* root){
        if(root==nullptr) return;
        intraverse(root->left);
        mulmap[root->val]++;
        intraverse(root->right);
    }
    vector<int> findMode(TreeNode* root) {
        vector<int> res;
        intraverse(root);
        int maxnode=0;
        for(auto it:mulmap){
            if(maxnode<it.second){
                res.clear();
                maxnode=it.second;
                res.push_back(it.first);
            }else if(maxnode==it.second){
                res.push_back(it.first);
            }
        }
        return res;
    }

Leetcode236——二叉树的最近公共祖先

题目描述:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

算法思想:

利用后序遍历的思想,遍历到目标节点直接向父节点返回状态,当某个父节点接收到两个目标节点的信息保存该节点不断向上返回。

算法实现:

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root || root==p || root==q) return root;
        TreeNode* ltree=lowestCommonAncestor(root->left,p,q);
        TreeNode* rtree=lowestCommonAncestor(root->right,p,q);
        if(ltree && rtree) return root;
        else if(!ltree && rtree) return rtree;
        else if(ltree && !rtree) return ltree;
        else return NULL;
    }

Leetcode235——二叉搜索树的最近公共祖先

题目描述:

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

算法思想:

利用二叉搜索树的特性,当当前遍历的父亲节点值大于两个目标节点时,公共祖先一定在左子树中;当当当前遍历的父亲节点值小于两个目标节点时,公共祖先节点一定在右子树中;当当前遍历的父亲节点值处于两个目标节点之间时,该节点就为公共祖先节点。(可画图感受魅力)

算法实现:

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root) return NULL;
        if(root->val>p->val && root->val>q->val){
            TreeNode* ltree=lowestCommonAncestor(root->left,p,q);
            if(ltree) return ltree;
        }else if(root->val<p->val && root->val<q->val){
            TreeNode *rtree=lowestCommonAncestor(root->right,p,q);
            if(rtree) return rtree;
        }
        return root;
    }

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值