530.二叉搜索树的最小绝对差
代码
class Solution { public: void travel(TreeNode* cur, vector<int>& result) { if (cur == nullptr) return; travel(cur->left, result); result.push_back(cur->val); travel(cur->right, result); } int getMinimumDifference(TreeNode* root) { vector<int> result; travel(root, result); int realres = 1000000; for (int i = 0; i + 1 < result.size(); i++) { int temp = result[i + 1] - result[i]; if (temp < realres) realres = temp; } return realres; } };
思路
利用中序遍历下,输出的二叉搜索树节点的数值是有序序列。
501.二叉搜索树中的众数*
代码
示例代码
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中 result.push_back(cur->val); } if (count > maxCount) { // 如果计数大于最大值频率 maxCount = count; // 更新最大频率 result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了 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; } };
思路
虽然仍然是二叉搜索树,但本题的示例代码没有将它们先放到数组中去做,而是直接在遍历树时就完成了这一操作,利用了双指针法。
我对于在递归结构中使用双指针法并不熟练,需要后续加强巩固。
236. 二叉树的最近公共祖先*
代码
示例代码
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 { // (left == NULL && right == NULL) return NULL; } } };
思路
本题使用后序遍历进行回溯,递归设置得相当巧妙。