从二叉树中查找子树

时间:2011-12-27 05:08:00

标签: c#

见下面的二叉树。 并在此处查看此算法的实现:http://msdn.microsoft.com/en-us/library/ms379572(v=vs.80).aspx

                       1                           level 0
                2              3                   level 1
            4    5   6    7        level 2
       8       9  10   11  12  13   14 15          level 3

我的问题是:如何根据级别从此树中发现子树?假设我想从15个编号的节点发现两个级别的子树。那么结果应该是

          3
      6       7
12     13     14     15

如果我搜索3层的树,那么它应该从1到15之间返回上面描述的完整树。

建议任何应该解决此问题的代码或算法或函数?

1 个答案:

答案 0 :(得分:0)

假设Node类定义为:

public class Node
{
    public Node Left { get; set; }
    public Node Right { get; set; }
    public int Value { get; set; }

    public Node(int value)
    {
        Value = value;
    }
}

您可以在此课程中添加以下两种方法,以实现您的目标:

public Node GetSubtree(int value, int depth)
{
    int foundDepth;
    return GetSubtreeHelper(value, depth, out foundDepth);
}

private Node GetSubtreeHelper(int value, int depth, out int foundDepth)
{
    if (Value == value)
    {
        foundDepth = 0;
        return depth == foundDepth ? this : null;
    }
    if (Left != null)
    {
        var node = Left.GetSubtreeHelper(value, depth, out foundDepth);
        if (foundDepth != -1)
        {
            return ++foundDepth == depth ? this : node;
        }
    }
    if (Right != null)
    {
        var node = Right.GetSubtreeHelper(value, depth, out foundDepth);
        if (foundDepth != -1)
        {
            return ++foundDepth == depth ? this : node;
        }
    }
    foundDepth = -1;
    return null;
}

使用问题中的树进行测试:

GetSubtree(15, 0) = Node 15
GetSubtree(15, 1) = Node 7
GetSubtree(15, 2) = Node 3
GetSubtree(15, 3) = Node 1
GetSubtree(15, 4) = null