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;
}
};