98.驗證二叉樹
中序遍歷二叉樹,每次遍歷存下當前節點的值,遍歷到下一個節點比較,根據二叉搜索樹的特性,左<中<右有:
如果當前值小于或等于上一個的值,說明不是二叉搜索樹
如果當前值大于上一個節點的值,繼續遍歷直到遍歷完整棵樹
TreeNode* pre = NULL;bool isValidBST(TreeNode* root) {if (root == NULL) return true;bool lf = isValidBST(root->left);if (pre && pre->val >= root->val) return false; pre = root;bool rg = isValidBST(root->right);return lf&&rg;}
530. 二叉搜索樹的最小絕對差
根據二叉搜索樹的特性,最小絕對查一定出現在一顆子樹的根和他的左右兒子的差值上,依舊使用中序遍歷
int res = INT_MAX;TreeNode* pre = NULL;int getMinimumDifference(TreeNode* root) {if (root == NULL) return res;int lf = getMinimumDifference(root->left);if (pre) {int a = root->val - pre->val;res = min(res, a);}pre = root;int rg = getMinimumDifference(root->right);return res;}
501.二叉搜索樹中的眾數
一個比較直接的方法就是用map存每一個值出現的頻率,然后導出最大頻率對應的數值
既然是二叉搜索樹,還是采用中序遍歷來實現對結果處理
vector<int> res;TreeNode* pre = NULL;int count1 = 0; // 用來計算頻率int count2 = 0;// 用來存最大頻率void dfs(TreeNode* root){if (root == NULL) return;dfs(root->left);if (pre == NULL) count1 = 1;else if (pre->val == root->val) count1++;else count1 = 1;pre = root;if (count1 == count2) res.push_back(root->val); // 出現最大頻率就將root放進結果集,這可以用來處理多個眾數的情況if (count1 > count2) { // 出現頻率更高的數,清空結果集,并將該數加入數組count2 = count1;res.clear();res.push_back(root->val);}dfs(root->right);return;}vector<int> findMode(TreeNode* root) {count1 = 0;count2 = 0;res.clear();dfs(root);return res;}