Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在BST中插入期间获取实际索引_Java_Algorithm_Binary Search Tree - Fatal编程技术网

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

Java 在BST中插入期间获取实际索引,java,algorithm,binary-search-tree,Java,Algorithm,Binary Search Tree,我想创建一个BST,在插入元素时,它将在一个完全平衡的树中返回它的索引。例如(括号中的数字表示实际索引): 或 在第二个例子中,我们可以看到元素1没有左子元素,但是元素2的索引仍然是3,就像在完全平衡树中一样 根节点以1开头 插入时返回索引的有效方法是什么 现在,在BST中插入一个元素时,我的代码如下所示: Node newNode = new Node(id); if(root==null){ root = newNode; return 1;

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

在第二个例子中,我们可以看到元素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;
                }
            }
        }
Node newNode=新节点(id);
if(root==null){
根=新节点;
返回1;
}
节点电流=根;
节点父节点=null;
while(true){
父项=当前;

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

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

您的实现将需要从具有左指针和右指针的节点更改为树所持有的任何数据类型的一维数组(本例中为整数)

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

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

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

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

您的实现将需要从具有左指针和右指针的节点更改为树所持有的任何数据类型的一维数组(本例中为整数)

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

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

中获得的信息我确实考虑过使用数组,但是我没有提到元素的数量最多为3*10^5。使用数组索引不是一个好的解决方案。@user1692342我不知道这会对这个实现产生什么不利影响。这很重要。如果输入的顺序是递增的。那么,元素将处于插入1、3、7、15等等。数组索引将非常快地增长,我将无法存储数组。@user1692342我以为你指的是节点值,而不是索引。我现在明白了。祝你好运。我确实想过使用数组,但我没有提到元素数最多为3*10^5。使用数组索引不是一个好的解决方案。@user1692342我不认为这会对这个实现产生任何不利影响。这很重要。如果输入的顺序是递增的。然后,元素将插入1、3、7、15等等。数组索引将很快变大,我将根本无法存储数组。@user16923我以为你指的是节点值,不是索引。我现在明白了。祝你好运。
1(1)
 \
  \
   2(3)
    \
     \
      3(7)
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;
                }
            }
        }