1、530二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。
我的思路:先中序遍历得到二叉树的单调序列,然后检查每查询相邻两个之间的最小值。也可以不记录序列,只记录上一个差值就行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: void traverse(TreeNode* root, vector<int> &midseq){ if(root == nullptr)return; traverse(root->left, midseq); midseq.emplace_back(root->val); traverse(root->right, midseq); } int getMinimumDifference(TreeNode* root) { vector<int> midseq; traverse(root,midseq); int mindiff = std::abs(midseq[1]-midseq[0]); for(int i = 2;i<midseq.size();i++){ int dif = std::abs(midseq[i]-midseq[i-1]); if(dif < mindiff){ mindiff = dif; } } return mindiff; } };
|
2、501二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
我的思路:先用中序遍历得到一个递增序列,然后用双指针去序列里寻找频率最高的元素。其实我认为也可以直接当普通二叉树来处理,递归遍历存储节点出现频率再HashMap中,最后在map里寻找最大值。
代码随想录:也是两种思路,首先通用二叉树遍历用HashMap存储,然后转为vector排序(map不能排序)。第二种他是直接在递归的过程中就计算频率。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| class Solution { public: void traverse(TreeNode* root, vector<int> &midseq){ if(root == nullptr)return; traverse(root->left, midseq); midseq.emplace_back(root->val); traverse(root->right, midseq); } vector<int> findMode(TreeNode* root) { vector<int> midseq; map<int,int> pq; traverse(root,midseq); int left = 0, right = 0; vector<int> res; int maxnum = 0; while(right < midseq.size()){ while(right < midseq.size() && midseq[left]==midseq[right]){ right++; } if((right-left) == maxnum){ res.emplace_back(midseq[left]); } if((right-left) > maxnum){ res.clear(); res.emplace_back(midseq[left]); maxnum = right-left; } left = right; } return res; } };
class Solution { private: int maxCount = 0; int count = 0; TreeNode* pre = NULL; vector<int> result; void searchBST(TreeNode* cur) { if (cur == NULL) return ;
searchBST(cur->left); if (pre == NULL) { count = 1; } else if (pre->val == cur->val) { count++; } else { count = 1; } pre = cur;
if (count == maxCount) { result.push_back(cur->val); }
if (count > maxCount) { maxCount = count; result.clear(); result.push_back(cur->val); }
searchBST(cur->right); return ; }
public: vector<int> findMode(TreeNode* root) { count = 0; maxCount = 0; pre = NULL; result.clear();
searchBST(root); return result; } };
|
3、236二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
我的思路:没做出来。之前我一直想如果p或q是子树根节点,那我返回之后岂不是无法遍历到另一个节点了。后面看了代码随想录后懂了,返回之后就不要遍历另一个节点了,因为这个返回节点就是root,已经找到了。
代码随想录
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 35
| class Solution { public: TreeNode* traverse(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == nullptr || root == p || root == q)return root;
TreeNode* leftre = traverse(root->left,p,q); TreeNode* righre = traverse(root->right,p,q);
if(leftre != nullptr && righre != nullptr)return root; if(leftre != nullptr)return leftre; if(righre != nullptr)return righre; return nullptr; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == nullptr)return nullptr; return traverse(root,p,q); } };
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == q || root == p || root == NULL) return root; TreeNode* left = lowestCommonAncestor(root->left, p, q); TreeNode* right = lowestCommonAncestor(root->right, p, q); if (left != NULL && right != NULL) return root;
if (left == NULL && right != NULL) return right; else if (left != NULL && right == NULL) return left; else { return NULL; } } };
|
代码随想录算法训练第十八天|530二叉搜索树的最小绝对差|501二叉搜索树中的众数|236二叉树的最近公共祖先