【发布时间】:2015-12-11 23:19:30
【问题描述】:
我正在处理类似 SPOJ 的任务。目标是在二叉树(不一定是 BST)中找到叶子,从树中删除它们并将它们作为一种双向链表返回,使用相同的结构 - TreeNode 并且没有额外的导入。例如,如果从树中删除节点 2、4 和 3,则函数返回列表的第一个非空元素:null 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 值而不是使用 null 引用会使我感到困惑,使用数组也是如此。恕我直言,使用原子引用会使它更加混乱。我很确定有一种方法可以以更优雅的方式(并正确删除叶子),可能是通过更改分配开始和结束 TreeNodes 的方法。我觉得我的方法和/或对所有工作方式的理解有问题。你能帮我把它变成一段简洁的代码并解释我的坏处吗?
【问题讨论】:
标签: java algorithm list recursion