当给定节点的二叉树时,如何编写返回节点链表的递归函数?

时间:2010-03-31 22:43:36

标签: algorithm recursion binary-tree traversal

我曾在接受采访时被问过这个问题:

  

如何编写递归函数   返回节点的链接列表,何时   给定节点的二叉树?   (展平数据)(更新:怎么样,不要只遍历树并将节点添加到全局结构。使函数完全递归,并修改二进制树)

出于某种原因,我倾向于需要超过3到5分钟来解决任何递归问题。通常,15到20分钟会更像它。我们怎样才能解决这个问题,例如一种非常系统的方法来达到解决方案,以便在3到5分钟的时间内解决它们?

4 个答案:

答案 0 :(得分:1)

有几种方法可以遍历二叉树。例如,你可以先生孩子,或者你可以得到左孩子,然后是父母,然后是右孩子。

假设您的节点包含字段valueleftChildrightChild。 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;
    }
}

添加自身,添加左侧分支展平,添加右侧分支展平