二叉搜索树

二叉搜索树(二叉查找树)

特点

  1. 左孩子小于父结点-右孩子大于父节点
  2. 中序遍历可以让结点有序

jJC35j.png

为什么中序遍历会有序

中序遍历-左子树-根结点-右子树

以上图为例进行中序遍历

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);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HANWEN KE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值