二叉搜索树特点
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
class Solution { public: TreeNode* searchBST(TreeNode* root, int val) { if (root == NULL || root->val == val) return root; if(root->val<val) return searchBST(root->right,val); if(root->val>val) return searchBST(root->left,val); return NULL; } };
-
二叉搜索树特点:中序遍历数据由小到大
-
思路1:额外定义数组vector存储中序遍历结果,判断后一个元素是否大于等于前一个即可
-
思路2:递归,中序遍历,定义一个最大值,若maxval更新过程中小于当前val则为false
-
class Solution { public: long long maxVal = LONG_MIN; // 因为后台测试数据中有int最小值 bool isValidBST(TreeNode* root) { //中序遍历搜索二叉树的结果是有序数列 if(root==NULL) return true; bool left=isValidBST(root->left); if(maxVal<root->val) maxVal=root->val; else return false; bool right=isValidBST(root->right); return left&&right; } };
class Solution { public: TreeNode* pre = NULL; // 用来记录前一个节点 bool isValidBST(TreeNode* root) { if (root == NULL) return true; bool left = isValidBST(root->left); if (pre != NULL && pre->val >= root->val) return false; pre = root; // 记录前一个节点 bool right = isValidBST(root->right); return left && right; } };
-
class Solution { public: int result = INT_MAX; TreeNode*pre=NULL;//前一个指针 int getMinimumDifference(TreeNode* root) { if(root!=NULL){ getMinimumDifference(root->left); if(pre!=NULL&&root!=NULL){ result=min(result,root->val-pre->val); } pre=root; getMinimumDifference(root->right); } return result; } };
-
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; } };