在BST中插入期间获取实际索引

时间:2016-04-22 19:29:11

标签: java algorithm binary-search-tree

我想创建一个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。存储在数组中以获取索引不是一种有效的方法

1 个答案:

答案 0 :(得分:0)

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

您的实现不会像堆一样平衡,但是您可以使用相同的概念,因为您可以知道在二叉树中每个级别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

获取的信息