【问题标题】:Get actual index during insertion in a BST在 BST 中插入期间获取实际索引
【发布时间】:2016-08-16 13:26:36
【问题描述】:

我想创建一个 BST,它在插入元素时会在完美平衡的树中返回它的索引。例如(括号中的数字表示实际索引):

  5(1)
    / \
   /   \
  3(2)  6(3)
 /
2(4)

1(1)
 \
  \
   2(3)
    \
     \
      3(7)

在第二个例子中,我们可以看到元素 1 没有左孩子,但元素 2 的索引仍然为 3,就像在完美平衡的树中一样。

根节点以1开头。

在插入时返回索引的有效方法是什么?

现在在 BST 中插入一个元素,我的代码如下:

Node newNode = new Node(id);
if(root==null){
            root = newNode;
            return 1;
        }

Node current = root;
        Node parent = null;
        while(true){
            parent = current;
            if(id<current.data){                
                current = current.left;
                if(current==null){
                    parent.left = newNode;
                    return;
                }
            }else{

                current = current.right;
                if(current==null){
                    parent.right = newNode;
                    return;
                }
            }
        }

我不明白我应该如何保持元素被插入到哪个级别来计算索引。

可以插入的元素数量最大为 3*10^5。存储在数组中获取索引不会是一种有效的方法

【问题讨论】:

    标签: java algorithm binary-search-tree


    【解决方案1】:

    解决方案是将二叉树表示为一维数组。这在二进制堆的实现中很常见。

    您的实现不会像堆那样平衡,但您可以使用相同的概念,因为您可以知道在二叉树的每个级别 i(从 0 开始)有 2^i 个空间.

    您的实现需要从具有左右指针的节点更改为树所包含的任何数据类型的一维数组(在您的情况下为整数)。

    您可以通过计算索引来导航树:

    • 节点 i 的父节点:array[i/2]
    • 节点 i 的左子节点:array[2i]
    • 节点 i 的右子节点:array[2i+1]

    http://www.cse.hut.fi/en/research/SVG/TRAKLA2/tutorials/heap_tutorial/taulukkona.html获得的信息

    【讨论】:

    • 我确实考虑过使用数组,但是我没有提到元素的数量最大为 3*10^5。使用数组索引不是一个好的解决方案。
    • @user1692342 我看不出这会对这个实现产生什么不利影响
    • 这很重要。如果输入是递增的。然后,元素将插入 1、3、7、15 等。很快数组索引就会变得非常大,我根本无法存储数组。
    • @user1692342 我以为你的意思是节点值,而不是索引。我现在知道了。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多