Random Node java 走地牙 CTCI 4.11

本文介绍了一种在二叉搜索树中高效选取随机节点的方法。通过在每个节点中维护一个额外的大小字段,可以实现O(log n)的时间复杂度来查找随机节点,避免了全树遍历的开销。
import java.util.*;

public class TreeNode {
    private int val;
    public TreeNode left, right;
    private int size = 0;

    public TreeNode(int val) {
        this.val = val;
        size = 1;
        left = right = null;
    }

    public int getSize() {return this.size;}
    public int getVal() {return this.val;}
/*
最简单的方法是遍历出整个的tree 然后取随机数进行 return, 但是那样浪费了时间o(n)和空间o(n),
还有一种方法是先找到整个tree的size 然后生成随机数, 按照遍历的顺序找到这个node,但是这样也消耗了o(n)的时间
好一点的方法是 如果在treenode中直接设立一个size的属性,这样直接就能生成一个随机数,如果这个数小于left的size 那么就去left 中找,以此类推
  找到为止;
*/
    public TreeNode getRandomNode() {
        int leftSize = left == null ? 0 : left.getSize();
        Random random = new Random();
        int index = random.nextInt(size);

        if(index == leftSize) {
            return this;
        } else if(index < leftSize) {
            return left.getRandomNode();
        } else {
            return right.getRandomNode();
        }
    }

    public void insertNode(int data) {
        if(data <= val) {
            if(left == null) {
                left = new TreeNode(data);
            } else {
                left.insertNode(data);
            }
        } else {
            if(right == null) {
                right = new TreeNode(data);
            } else {
                right.insertNode(data);
            }
        }
        size++;
        return;
    }

    public TreeNode find(int data) {
        if(val == data) {
            return this;
        } else if(data < val) {
            return left == null ? null : left.find(data);
        } else {
            return right == null ? null : right.find(data);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值