2011-12-27 4 views
1

См. Ниже двоичное дерево. И видеть реализацию этого здесь: алгоритме 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.

Дайте мне предложить для любого кода или алгоритма или функции, которые должны быть Решимость Эта проблема?

+2

Вы ссылаетесь на BST или просто бинарное дерево? Это должно быть довольно легко, в любом случае. Реальный вопрос: как вы можете найти N-го родителя узла? Этот узел является поддеревом, которое вы ищете. Как найти ближайшего родителя узла? – Kobi

+0

Я имею в виду BST. Но какой метод обхода полезен для нахождения этого N-го родительского узла. или у вас есть алгоритм? –

+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; 
} 

Testing это с помощью дерева в вашем ответе:

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

описание товара hi Indium, спасибо. Позвольте мне проверить этот код с реализацией алгоритма BST, который задан в вопросе. –

+0

Дерево в вашем примере не является BST, поэтому мой код предназначен для работы с общим двоичным деревом. Фаза поиска может быть оптимизирована, если она предназначена только для BST. – Iridium

+0

Спасибо, что ответили. Я прочитал несколько блогов и книг для BST, и я думаю, что вы правы. Но можете ли вы дать мне некоторое решение, которое будет установлено в приведенном выше примере (http://msdn.microsoft.com/en-us/library/ms379572(v=vs.80).aspx). большое спасибо. Или вы предлагаете мне ссылку для BST, где ваш код должен быть подключен. –

Смежные вопросы