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
,但不返回值。