二叉查找树

1.左边节点的值总是小于等于根节点,右边节点的值总是大于等于根节点

修建二叉树:把二叉树的每个节点的值限制在一个范围<L,R>之间

思路:先判断根节点的值;如果根节点的值,大于R,则递归左子树的值,根节点+右子树被全部抛弃;

如果根节点的值,小于L,则递归右子树的值,根节点+左子树被全部抛弃;

如果根节点位于两个值之间,则开始递归求解左子树/右子树是否满足上述条件。

public TreeNode trimBST(TreeNode root, int L, int R) {
    if (root == null) return null;
    if (root.val > R) return trimBST(root.left, L, R);
    if (root.val < L) return trimBST(root.right, L, R);
    root.left = trimBST(root.left, L, R);
    root.right = trimBST(root.right, L, R);
    return root;
}

2.查找二叉搜索树的第K个最小值

利用二叉搜索树的节点个数进行判断

左节点的值:计算出二叉树左节点的个数,如果左节点的个数等于k-1;则根节点就是我们要找的值,如果左节点的个数大于k-1,表明我们要查找的第k个最小元素在左子树中,如果左节点的个数小于k-1,表明要查找的第k个最小元素在右子节点中,找到右子树中第k-count(left)-1个元素就是我们要找的元素

class Solution {
    public int kthSmallest(TreeNode root, int k) {
        /*
        迭代
        */
        int leftcon=count(root.left);
        if(leftcon==k-1) return root.val;
        if(leftcon>k-1) return  kthSmallest(root.left, k);
        return  kthSmallest( root.right, k-leftcon-1);
    }
    public int count(TreeNode root){
        if(root==null) return 0;
        return 1+count(root.left)+count(root.right);
    }
}

中序遍历求解思路:

先遍历左子树,再遍历右子树,求第k个值

class Solution {
    private int cnt=0;
    private int val;
    public int kthSmallest(TreeNode root, int k) {
       //中序遍历
        inOrder(root,k);
        return val;
}
    public void inOrder(TreeNode node,int k){
        if(node==null) return;
        inOrder(node.left,k);
        cnt++;
        if(cnt==k){
            val=node.val;
            return;
        }
        inOrder(node.right,k);
    }
}

3.将二叉查找树的所有节点的大于等于他的节点的值进行累加。

思路:先遍历右节点,将当前节点的右节点的值与此节点相加,然后修改当前节点的值为累加后的和;最后遍历左子树,加上修改后的根节点的值。

private int sum = 0;

public TreeNode convertBST(TreeNode root) {
    traver(root);
    return root;
}

private void traver(TreeNode node) {
    if (node == null) return;
    traver(node.right);
    sum += node.val;
    node.val = sum;
    traver(node.left);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值