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;}