我曾在接受采访时被问过这个问题:
如何编写递归函数 返回节点的链接列表,何时 给定节点的二叉树? (展平数据)(更新:怎么样,不要只遍历树并将节点添加到全局结构。使函数完全递归,并修改二进制树)
出于某种原因,我倾向于需要超过3到5分钟来解决任何递归问题。通常,15到20分钟会更像它。我们怎样才能解决这个问题,例如一种非常系统的方法来达到解决方案,以便在3到5分钟的时间内解决它们?
答案 0 :(得分:1)
有几种方法可以遍历二叉树。例如,你可以先生孩子,或者你可以得到左孩子,然后是父母,然后是右孩子。
假设您的节点包含字段value
,leftChild
和rightChild
。 leftchild-parent-rightchild traversal的示例java代码:
public List<Node> traverseTree (Node parentNode) {
List<Node> nodes = new LinkedList<Node> ();
if (parentNode.hasLeftChild ()) {
nodes.addAll (traverseTree (parentNode.getLeftChild ()));
}
nodes.add (parentNode);
if (parentNode.hasRightChild ()) {
nodes.addAll (traverseTree (parentNode.getRightChild ()));
}
return nodes;
}
答案 1 :(得分:1)
几乎是@vittore所做的,但是使用单个列表分配(但它会在内部重新分配,所以......)。这也可能是(大脑出现故障)。
public List<Tree> Flat(List<Tree> t)
{
var t = t ?? new List<Tree>();
Left != null ? Left.Flat(t):;
t.Add(this);
Right != null ? Right.Flat(t):;
return t;
}
答案 2 :(得分:0)
如何“制作两个分支的链接列表,然后将一个分支附加到另一个分支”?
我认为不存在能够在不到5分钟内解决任何递归问题的系统方法。有时问题的分形性质太难找了。
答案 3 :(得分:0)
喜欢那个
public class Tree
{
public Tree Left { get; set; }
public Tree Right { get; set; }
public List<Tree> FlatTree()
{
var list = new List<Tree>();
list.Add(this);
if (Left!=null) list.AddRange(Left.FlatTree());
if (Right!= null) list.AddRange(Right.FlatTree());
return list;
}
}
添加自身,添加左侧分支展平,添加右侧分支展平