Одно из возможных решений:
Я создал класс дерева, который имеет метод GetNextLeafNode(). Это отвечает за возврат следующего ближайшего листового узла дерева.
С классом дерева я держу стек для поддержания пересекаемых элементов
В методе GetNextLeafNode(), я делаю итерационный обход дерева (Предварительный заказ).
Когда я сталкиваюсь с узлом (stack.Pop()), который является листом, я просто возвращаю его. В противном случае я нажимаю левый и правый указатели на стек. Изначально корень узла. В любое время состояние стека является правильным.
Вот код в C#:
public TreeNode GetNextLeafNode()
{
TreeNode leaf = null;
while (s.Count != 0)
{
TreeNode n = s.Pop();
if ((n.Left == null) && (n.Right == null))
{
leaf = n;
return leaf;
}
else
{
if (n.Right != null)
s.Push(n.Right);
if (n.Left != null)
s.Push(n.Left);
}
}
return leaf;
}
Теперь мы можем создать два различных деревьев говорят, t1 и t2. Мы можем сделать Comparision следующим образом:
int data1 = t1.GetNextLeafNode().Data;
int data2 = t2.GetNextLeafNode().Data;
while (data1 == data2)
{
//both the leaf nodes are same.
data1 = t1.GetNextLeafNode().Data;
data2 = t2.GetNextLeafNode().Data;
}
Если TEMP1 не листовым узлом и имеет только правый (лист) ребенка, как бы вы туда? –