Есть много способов сделать это.
Я бы посоветовал вам превратить дерево в отсортированный массив троек из (parent, child, direction)
. Итак, начните с дерева1:
4
/ \
3 2
/ \ / \
5 8 10 22
Это быстро становится:
(None, 4, None) # top
(4, 3, L)
(3, 5, L)
(3, 8, L)
(4, 2, R)
(2, 10, L)
(2, 22, R)
Что вы сортируете, чтобы получить
(None, 4, None) # top
(2, 10, L)
(2, 22, R)
(3, 5, L)
(3, 8, L)
(4, 2, R)
(4, 3, L)
Сделайте то же самое с другим, а затем отличайтесь от них.
Учитывая дерево и разность, вы можете сначала превратить дерево в эту форму, посмотреть на разность, понять, в каком направлении оно находится, и получить желаемое представление с помощью патча. Затем вы можете рекурсивно восстановить другое дерево.
Причина, по которой я бы сделал это с этим представлением, состоит в том, что если два дерева имеют общие поддеревья - даже если они расположены по-разному в главном дереве - они будут отображаться совместно. И поэтому вы, вероятно, получите сравнительно небольшие различия, если деревья действительно будут совпадать каким-то интересным образом.
Редактировать
Для точки из @ruakh предполагается, что значения не повторяются в дереве. Если они это сделают, то вы могли бы сделать такое представление:
4
/ \
3 2
/ \ / \
5 8 10 22
становится
(, 4)
(0, 3)
(00, 5)
(01, 8)
(1, 2)
(10, 10)
(11, 22)
И теперь, если вы переместите поддеревья, они будут отображаться как большие различия. Но если вы просто измените один узел, это все равно будет небольшая разница.
Вы не можете. C# 2.0 не имеет дополнительных методов вообще. Можно использовать дополнительные методы от C# 3.0 в Visual Studio предназначение 2008 года для.NET 2.0, как описано в моей статье "C#/.NET versions", но Вы не можете убедить компилятор C# 2.0 действовать, как будто это понимает, каковы дополнительные методы.
Теги говорят что.NET 2.0; Если Вы используете C# 3.0 (т.е. VS 2008) и нацелены на.NET 2.0, можно сделать это путем объявления ExtensionAttribute - или (легче) просто ссылочный LINQBridge.
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class |
AttributeTargets.Method)]
public sealed class ExtensionAttribute : Attribute { }
}
С этим на месте, дополнительные методы будут работать в.NET 2.0 с C# 3.0.
Дополнительные методы не будут работать в C# 2, потому что они полагаются на компилятор C# 3. Компилятор C# 3 знает, как сделать перевод из этого:
foo.Bar()
к этому:
ExtensionClass.Bar(foo)
Как JS заявила, C# 2.0 не имеет дополнительных методов.
Также тот дополнительный метод был бы определен как:
public static DataTable ToDataTable(this IDataReader reader)
Попытайтесь назвать его как:
DataReaderExtensions.ToDataTable(
cust.GetCustomerOrderSummary((string)Session["CustomerNumber"])
)