Arrays 在数组中按顺序遍历存储BinarySearchTree

Arrays 在数组中按顺序遍历存储BinarySearchTree,arrays,binary-search-tree,inorder,Arrays,Binary Search Tree,Inorder,我参考了下面的链接来了解如何将顺序遍历保存到数组中 我的树: 100 / \ 50 300 / \ 20 70 当第一个元素(20)插入到数组中时,索引值将增加到1。现在,当控件获取下一个节点(50)时,索引值将变为0 代码: storeInOrder(root1,arr1,0); private static void storeInOrder(Node root1, int[] arr1, int index) {

我参考了下面的链接来了解如何将顺序遍历保存到数组中

我的树:

       100
      /  \
    50    300
   / \
  20  70
当第一个元素(20)插入到数组中时,索引值将增加到1。现在,当控件获取下一个节点(50)时,索引值将变为0

代码:

storeInOrder(root1,arr1,0);

private static void storeInOrder(Node root1, int[] arr1, int index) {       
    if(root1 == null){return;}

    storeInOrder(root1.left, arr1,index);       
    arr1[index++] = root1.data;
    storeInOrder(root1.right,arr1,index);
}
阵列中的预期输出:20 50 70 100 300

我得到的输出为100 300 00

将逻辑放入访问代码的想法是正确的,但您需要一个全局索引。在您的实现中,您修改的索引是按值传递的,这不会导致所需的行为,因为只更改了值的本地副本。Java中的公式可以如下所示

int[] iArray; // initialize with the desired size
int GlobalIndex = 0;

void Visit(Node iNode)
{
    iArray[GlobalIndex++] = iNode.Data;
}

void StoreInOrder(Node iRoot)
{       
    if(null != iRoot)
    {
        StoreInOrder(iRoot.Left);       
        Visit(iRoot);
        StoreInOrder(iRoot.Right);
    }
}
或者,以更接近原始问题的更简洁的形式

int[] iArray; // initialize with the desired size
int GlobalIndex = 0;

void StoreInOrder(Node iRoot)
{       
    if(null != iRoot)
    {
        StoreInOrder(iRoot.Left);
        iArray[GlobalIndex++] = iNode.Data;
        StoreInOrder(iRoot.Right);
    }
}
如果实现必须尽可能接近原始版本,则可以使用以下版本。它使用
int
的包装器类来替代按引用调用,因为Java不允许对基本数据类型按引用调用

class IntWrapper
{
    public int Value;
    public IntWrapper(int InitialValue)
    {
        Value = InitialValue;
    }
}

int[] iArray;

StoreInOrder(iRoot, iArray, new IntWrapper() )

void StoreInOrder(Node iRoot, int[] iArray, IntWrapper Index)
{
    StoreInOrder(iRoot.Left,iArray,Index);
    iArray[Index.Value++] = iNode.Data;
    StoreInOrder(iRoot.Right,iArray,Index);
}

您可以修改该函数以返回上次使用的索引,然后根据新索引进行更新

storeInOrder(root1,arr1);
私有静态void存储顺序(节点root1,int[]arr1){
storeinordercursive(root1,arr1,0);
}
私有静态整数storeInOrderCursive(节点root1,int[]arr1,int索引){
如果(root1==null){返回索引;}
index=storeInOrderCursive(root1.left,arr1,index);
arr1[index++]=root1.data;
StoreInOrderCursive(root1.right,arr1,index);
收益指数;
}

包装函数不是必需的,但因为您总是将0传递给
storeinordercursive
,这使得API类似,然后调用
storeInOrder
时,返回值仍然可以是
void

你用什么语言写这个?您的索引参数似乎没有通过引用传递。@我正在用Java编写函数
storeInOrderCursive
将其返回类型声明为
Integer
,但不返回值。