avatar

目录
二叉树专题
  1. 二叉树的最近公共祖先
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
TreeNode* ans;
bool dfs(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == nullptr) return false;
bool lson = dfs(root->left, p, q);
bool rson = dfs(root->right, p, q);
if ((lson && rson) || ((root->val == p->val || root->val == q->val) && (lson || rson))) {
ans = root;
}
return lson || rson || (root->val == p->val || root->val == q->val);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
dfs(root, p, q);
return ans;
}
};
  1. 二叉树展开为链表
  • 将左子树插入到右子树的地方
  • 将原来的右子树接到左子树的最右边节点
  • 考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null
    记得吧左子树置空
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
void flatten(TreeNode* root) {
TreeNode* pre=root;
while(root!=nullptr){
pre=root->left;
if(root->left!=nullptr){
while(pre->right!=nullptr){
pre=pre->right;
}
pre->right=root->right;
root->right=root->left;
root->left=nullptr;
}
root=root->right;
}

}
};
  1. 二叉搜索树中的众数
    第一种方法就是遍历一遍吧每个数出现的次数记录一下,然后换到vector来排序一下
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
private:

void searchBST(TreeNode* cur, unordered_map<int, int>& map) { // 前序遍历
if (cur == NULL) return ;
map[cur->val]++; // 统计元素频率
searchBST(cur->left, map);
searchBST(cur->right, map);
return ;
}
bool static cmp (const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
public:
vector<int> findMode(TreeNode* root) {
unordered_map<int, int> map;
vector<int> result;
if (root == NULL) return result;
searchBST(root, map);
vector<pair<int, int>> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), cmp); // 给频率排个序
result.push_back(vec[0].first);
for (int i = 1; i < vec.size(); i++) {
if (vec[i].second == vec[0].second) result.push_back(vec[i].first);
else break;
}
return result;
}
};

上面的代码可以优化,省掉闯创建vec和对vec排序的过程(上面这个主要是为了展示怎么对pair写排序),就是存储map的时候,同时记录最大值max,然后遍历map找到所有value为max的key就好了

再进一步优化空间就是采用递归充分利用二叉搜索树的性质,

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public:
vector<int>res;
int imax = 0,count = 0;
TreeNode* pre;
void dfs(TreeNode* cur){
if(cur == NULL)return;
dfs(cur->left);
if(pre == NULL){
count = 1;
}
else if (pre->val == cur->val){
count++;
}
else{
count = 1;
}
if(count == imax)
res.push_back(cur->val);
if(count > imax){
res.clear();
res.push_back(cur->val);
imax = count;
}
pre = cur;
dfs(cur->right);
}
vector<int> findMode(TreeNode* root) {
if(root == NULL)return res;
dfs(root);
return res;

}
};
文章作者: Sunxin
文章链接: https://sunxin18.github.io/2020/07/29/binary-tree/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论