Я работал над задачей, подобной SPOJ. Цель состояла в том, чтобы найти листья в двоичном дереве (не обязательно BST), удалить их из дерева и вернуть их как своего рода дважды связанный список, используя ту же структуру - TreeNode и никаких дополнительных импортов. Например, если узлы 2, 4 и 3 удалены из дерева, функция возвращает первый ненулевой элемент списка: null < - 2 < -> 4 < -> 3 -> null. TreeNode имеет значение и указатели влево и вправо.Как вернуть дважды связанный список и удалить листья дерева?
Я использовал рекурсию и аннулировал листья, чтобы удалить их из дерева и воссоздал их в списке. Чтобы добавить элемент в конец списка, я удерживал указатель на последний элемент списка. Это создало хорошо известную проблему изменения объекта, переданного функции. Вот мой код:
public TreeNode getLeaves(TreeNode root)
{
if(root == null)
return null;
TreeNode start = new TreeNode(Integer.MIN_VALUE);
TreeNode[] end = {start};
getLeaves(root, start, end);
return start;
}
private void getLeaves(TreeNode root, TreeNode start, TreeNode[] end)
{
if(root == null)
return;
if(root.left == null && root.right == null)
{
addToList(root, start, end);
root = null;
return;
}
getLeaves(root.left, start, end);
getLeaves(root.right, start, end);
}
private void addToList(TreeNode element, TreeNode start, TreeNode[] end)
{
if(end[0].value != Integer.MIN_VALUE)
{
TreeNode t = new TreeNode (element.value);
end[0].right = t;
t.left = end[0];
end[0] = t;
}
else
{
start.value = element.value;
}
}
Удаление листьев из дерева не работает, но список возвращается правильно. Однако, установив значение «start» TreeNode на минимальное значение int вместо использования пустых ссылок, я также использую массив. Использование Atomic Reference сделает его более беспорядочным IMHO. Я совершенно уверен, что есть способ сделать это гораздо более изящным способом (и удалять листья должным образом), возможно, путем изменения подхода назначения начального и конечного TreeNodes. Я чувствую, что что-то не так с моим подходом и/или пониманием того, как все это работает. Не могли бы вы помочь мне превратить его в аккуратный фрагмент кода и объяснить мои неудачи?