繁体   English   中英

如何创建一个二进制搜索树,其中包括从1到n的所有数字

[英]How to create a binary search tree that includes all numbers from 1 to n

我正在尝试创建一个二进制搜索树,其中包括从1到n的所有数字。 一个例子是从1到5会像

根数:3

root.left:2

root.left.left = 1

root.right = 4

root.right.right = 5

这棵树碰巧不是很平衡,但是我更喜欢一种能产生尽可能平衡的树的方法。

我正在尝试为此创建自己的数据结构,因此我基本上只是编写了一个Node类:

    private class BinaryNode{
        int data;
        BinaryNode left;
        BinaryNode right;
        BinaryNode parent;
    }

而且我计划在另一个类中包含该树本身。 我一直在寻找一个合适的方法来确定树的左/右值,任何帮助表示赞赏!

根节点上的数据为(n+1)/2 如果您有一个表示范围[i..j]的子树,则该子树的根为(i+j)/2 (使用整数算术)。

您可以使用以下事实递归构建树:

static BinaryNode build(int i, int j) {
    if (i > j) return null;

    int mid = (i + j) / 2;  // Assumes i >= 0.

    BinaryNode node = new BinaryNode();
    node.data = mid;

    node.left = build(i, mid - 1);
    if (node.left != null) node.left.parent = node;

    node.right = build(mid + 1, j);
    if (node.right != null) node.right.parent = node;

    return node;
}

然后开始递归调用:

BinaryNode node = build(1, n);

但是,必须指出的是,这样的二进制搜索树(将连续的整数从1到n存储)是没有用的:您也可以简单地使用数组,然后使用数组索引“搜索”它。

public void insert(int id){
    Node newNode = new Node(id);
    if(root==null){
        root = newNode;
        return;
    }
    Node current = root;
    Node parent = null;
    while(true){
        parent = current;
        if(id<current.data){                
            current = current.left;
            if(current==null){
                parent.left = newNode;
                newNode.parent = parent;
                return;
            }
        }else{
            current = current.right;
            if(current==null){
                parent.right = newNode;
                newNode.parent = parent;
                return;
            }
        }
    }
}

不进行递归插入1到n个数字。

public static void main(String arg[]){
    Solution2 s = new Solution2();
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    for(int i = 1;i <= n;i++){
        s.insert(i);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM