通用二叉搜索树

时间:2013-02-04 18:31:16

标签: generics c++-cli binary-search-tree

我正在研究二叉搜索树控制台应用程序,特别是列出两个目标节点之间最短路径的方法。我的方法是

1)创建树中每个目标节点的值的ArrayList,从根节点到目标(每个路径一个ArrayList) 2)比较两个ArrayLists,删除除最后一个之外的所有重复项(表示两个路径分支的位置) 3)将剩余的两个ArrayLists组合成一个数组并使用for循环打印到控制台

这是我正在使用的方法。我遇到的问题是我永远不会进入读取“if(list1 [n] == list2 [n])”的块,即使ArrayLists正在打印出值 _pathArrayList1的内容:5,7,9 _pathArrayList2的内容:5,7,9,10,12,11

我尝试了排版,但这没有帮助。

array<T>^ removeDuplicates(ArrayList^ list1, ArrayList^ list2)
{
    int forLoopCount;
    int i; // for loop iterator for this method
    Console::WriteLine(L"Contents of _pathArrayList1: ");
    for (i = 0; i < list1->Count; i++)
        Console::WriteLine(list1[i]);

    Console::WriteLine(L"Contents of _pathArrayList2"); 
    for (i = 0; i < list2->Count; i++)
        Console::WriteLine(list2[i]);

    // find out which array is the shortest; we need to use the shorter of the two
    if (list1->Count - list2->Count < 0)
        forLoopCount = list1->Count;
    else
        forLoopCount = list2->Count;
    Console::WriteLine("Value of forLoopCopunt is " + forLoopCount);
    array<T>^ combineArray = gcnew array<T>(forLoopCount);

    for (int n = 0; n < forLoopCount; n++)
    {
        Console::WriteLine(L"List1[n] = " + list1[n]);
        Console::WriteLine(L"list2[n] = " + list2[n]);

        if (list1[n] == list2[n])  // never entering this block of code
        {
            if (list2[n+1] == list1[n+1])
            {
                Console::WriteLine(L"Removing " + list1[n] + " and " + list2[n]);
                list1->RemoveAt(n);
                list2->RemoveAt(n);
                n --;
            }
            else
            {
                Console::WriteLine(L"Deleting " + list1[n]);
                list1->RemoveAt(n);
                //_pathArrayList1->Reverse();
                return combineArray = combineArrays(_pathArrayList1, _pathArrayList2);
            }
        }
    }
    return combineArray = combineArrays(_pathArrayList1, _pathArrayList2);
}

1 个答案:

答案 0 :(得分:0)

请澄清“我尝试过排版,但这没有帮助。”

ArrayList不使用泛型,因此它将所有内容都作为对象处理。即使两个对象都是整数,当它们被输入为Object时,==也不会按预期比较整数值。

Object^ o1 = 1;
Object^ o2 = 1;

bool asObject = (o1 == o2); // false
bool asInt = ((int)o1 == (int)o2); // true

如果您为ArrayList切换List<int>,那么==将按预期工作,并具有类型安全的额外好处。

其他注释:

  • 设置forLoopCount时使用Math.Min。如果其他人不得不停下来思考它是否正确,那么对于那些简单的事情,请使用该功能。
  • 在检查list2[n+1] == list1[n+1]之前,请确保两个列表中都有额外的项目。在您的示例数据(5-7-9和5-7-9-10-12-11)中,当list1[n]为9时,这会给您一个例外。
  • 您可以完全删除gcnew array<T>(forLoopCount),甚至combineArray。当您指定combineArrays的返回值时,该对象将被丢弃。

修改

如果传递列表中的对象是项本身(不是它们的节点地址,或者其他始终为int的东西),那么我建议将where T : IEquatable<T>添加到通用定义中。这为您提供了Equals(T)方法,您可以使用该方法代替==,而不是为所有类型定义的<。 (如果你在你的类型上实现这个,只要确保实现所有三种方法Equals(T),Equals(object)和GetHashCode(),这样一切都是一致的。)

为了帮助您首先构建搜索树,您可能会发现IComparable<T>非常有用。使用CompareTo方法代替比较运算符(例如{{1}})。