LeetCode Day20 二叉树

501 二叉搜索树中的众数

题目理解

找到二叉搜索树中出现频率最高的元素,可能并不唯一。

思路

想要不使用额外空间,要在边遍历二叉树的同时,输出频率最高的元素。
如果不是搜索树,需要将二叉树中元素出现的频率统计下来,然后找到出现频率最高的元素,但二叉搜索树按照中序遍历是有序的,只需要将相邻的元素比较,把出现频率最高的输出即可。
怎样边遍历边输出呢,需要用一个变量count来统计元素出现次数,用maxcount表示当前的最高频率,如果count>maxcount,则更新maxcount,将元素输出到结果数组中,这里需要注意的是如果结果数组中原来有元素,需要将结果数组清空,如果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:
    int count,maxcount;
    vector<int> res;
    TreeNode* pre = nullptr;
    void traversal(TreeNode* cur) {
        if(!cur)
            return;
        traversal(cur->left);
        if(pre && cur->val == pre->val)
            count++;
        else
            count = 1;
        pre = cur;
        if(count > maxcount) {
            maxcount = count;
            res.clear();
            res.push_back(cur->val);
        }else if(count == maxcount)
            res.push_back(cur->val);
        traversal(cur->right);
    }
    vector<int> findMode(TreeNode* root) {
        traversal(root);
        return res;
    }
};

二叉树的最近公共祖先

题目

找到二叉树的两个节点最近的公共祖先,可以是节点本身。
在这里插入图片描述

思路

如果从下向上查找,更容易找到最近公共祖先,需要用到回溯,按照后序遍历的顺序,如果两个指定节点分别在当前节点的左右子树中,则当前节点为两节点的公共祖先。如果当前节点值等于指定节点其中之一,则返回当前节点,遍历当前节点的左右子树,如果返回值不为空的话,则说明指定节点在当前节点子树中,返回子树节点。因为是从下向上查找,因此最终返回的是距离指定节点最近的公共祖先。

代码

/**
 * 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 == nullptr)
            return root;
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if(left && right)
            return root;
        else if(!left && right)
            return right;
        else if(left && !right)
            return left;
        else 
            return nullptr;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值