530.二叉搜索樹的最小絕對差
思路一:二叉搜索樹的中序遍歷必為升序數組,加入數組后計算相鄰兩個數差值,即可求出最小絕對差
思路二:同樣的思路,中序遍歷,直接使用指針記錄上一個節點,同時更新差值
class Solution {
public:int res=INT_MAX;TreeNode*pre=nullptr;void judge(TreeNode*root){if(root==nullptr) return;judge(root->left);if(pre!=nullptr)res=min(res,root->val-pre->val);pre=root;judge(root->right);}int getMinimumDifference(TreeNode* root) {//思路二:雙指針遞歸,中序遍歷,計算兩節點之間差值judge(root);return res;}
};
501.二叉搜索樹中的眾數
思路一:使用map和vector,遍歷二叉搜索樹用map記錄元素出現的次數,一次遍歷map求出最大次數,二次遍歷map求出等于最大次數的值,加入到vector中思路二:使用指針記錄pre前一個元素,當pre元素和當前cur元素相等時,更新count值;當pre元素和當前cur元素不等時,使用count更新最大次數值maxNum;
當count值大于maxNum時,清空數組,把新的元素加入數組;
當count值等于maxNum時,把該元素加入數組
236.二叉樹的最近公共祖先
思路一:第一次遍歷二叉樹使用左0右1來記錄p和q的路徑,然后找出兩個路徑的相同值,再使用該相同值去遍歷二叉樹,最后遍歷到的值即為最近公共祖先
思路二:(自底向上)后序遍歷,考慮兩個指定值的分布情況,使用兩個指針保存兩個指定值,找到直接返回,找不到返回nullptr
class Solution {
public:TreeNode*judge(TreeNode*root,TreeNode*p,TreeNode*q){if(root==nullptr) return root; if(root==p || root==q) return root;//遍歷到值時直接返回TreeNode*left=judge(root->left,p,q);TreeNode*right=judge(root->right,p,q);if(left!=nullptr && right!=nullptr) return root;//指定值分布再兩側if(right!=nullptr) return right;//指定值分布在右側if(left!=nullptr) return left;//指定值分布在左側return nullptr;//重點:左右都不存在需返回nullptr}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {//后序遍歷return judge(root,p,q);}
};