二叉搜索树(二叉查找树)
特点
- 左孩子小于父结点-右孩子大于父节点
- 中序遍历可以让结点有序
为什么中序遍历会有序
中序遍历-左子树-根结点-右子树
以上图为例进行中序遍历
1 2 3 4 5 6
练习题
1038. 把二叉搜索树转换为累加树 |
---|
230. 二叉搜索树中第K小的元素 |
538. 把二叉搜索树转换为累加树 |
剑指 Offer II 054. 所有大于等于节点的值之和 |
树的递归遍历框架
void Travers(TreeNode *root){
if(root==null){
return null;
}
/*前中后序遍历就是在 递归的过程中-不同的位置做不同的事情*/
//前序
Traverse(root->left);
//中序遍历
Traverse(root->right);
//后序
}
```cpp
## 对应习题C++代码
### 1038. 把二叉搜索树转换为累加树
```cpp
class Solution {
public:
TreeNode* bstToGst(TreeNode* root) {
Traverse(root);
return root;
}
private:
int sum=0;
void Traverse(TreeNode *root){
if(root==nullptr){
return;
}
Traverse(root->right);
sum+=root->val;
root->val=sum;
Traverse(root->left);
}
};
230二叉搜索树中第K小的元素
class Solution {
//记录结果值
int res=-1;
public:
int kthSmallest(TreeNode* root, int k) {
Traverse(root,k);
return res;
}
private:
int count=0;
void Traverse(TreeNode *root ,int k){
if(root ==nullptr){
return ;
}
//遍历的第一个值就是第一个小,所以遍历一次加一次就OK
Traverse(root->left,k);
//在离开的时候进行++
count++;
if(count==k){
res=root->val;
}
Traverse(root->right, k);
}
};
538. 把二叉搜索树转换为累加树
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
Traverse(root);
return root;
}
/*思路:中序遍历可以正序打印一个二叉搜索树的值:那么我们将其反过来就是倒序打印
将其转化为累加树--每个结点的新值大于等于原树node.val之和
*/
private:
int sum=0;
void Traverse(TreeNode *root){
if(root==nullptr){
return ;
}
Traverse(root->right);
sum+=root->val;
root->val=sum;
Traverse(root->left);
}
};
剑指 Offer II 054. 所有大于等于节点的值之和
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
Traverse(root);
return root;
}
private:
int sum=0;
void Traverse(TreeNode *root){
if(root==nullptr){
return ;
}
Traverse(root->right);
sum+=root->val;
root->val=sum;
Traverse(root->left);
}
};