vyvážený strom binárního vyhledávání pomocí sortedset

hlasů
0

Prosím, pomozte jsem se snaží vytvářet náhodné binární vyhledávací strom velikosti 1024 a prvky musí být náhodný sortedset ... Jsem schopen psát kód ručně vytvořit strom binárního vyhledávání přidáním prvků ručně, ale já m unablele yo napsat kód, který bude generovat náhodné vyvážený binární strom velikosti 1024 pak pomocí pokusit se najít klíč v tom stromě ... prosím, prosím a děkuji předem ....

Edit přidal kód z připomínek

ya to je domácí úkol ... a to je to, co jsem dostal tak daleko, kód:

using System; 
namespace bst { 
    public class Node { 
        public int value; 
        public Node Right = null; 
        public Node Left = null; 

        public Node(int value) 
        { 
            this.value = value; 
        } 
    } 

    public class BST { 
        public Node Root = null; 
        public BST() { }

        public void Add(int new_value) 
        { 
            if(Search(new_value)) 
            {
                Console.WriteLine(value ( + new_value + ) already);
            }
            else
            {
                AddNode(this.Root,new_value);
            }
        }
    }
}
Položena 21/01/2011 v 00:53
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Používat rekurzi. Každá pobočka generuje novou pobočku, vyberte prostřední položku v netříděného set, mediánu. Vložte jej do aktuální položky ve stromě. Zkopírovat všechny položky méně než medián do jiného pole, poslat, že nové pole na výzvu stejným způsobem. Kopírovat všechny položky vyšší než medián do jiného pole, poslat, že nové pole na výzvu stejným způsobem. \

Vyvážené stromy musí mít lichý počet bodů, pokud hlavní nadřazený uzel není vyplněna. Je třeba se rozhodnout, zda existují dvě hodnoty, které jsou Median, zda je duplicitní patří na spodní větev nebo horní větev. Dal jsem duplikáty na horní větve v mém příkladu.

Medián bude číslo, na kterém stejné množství čísel je menší než a větší než počet. 1,2,3,3,4,18,29,105,123 V tomto případě je medián 4, přestože průměrná (nebo průměr) je mnohem vyšší.

Jsem neměl obsahovat kód, který určuje medián.

BuildTreeItem(TreeItem Item, Array Set)  
{
  Array Smalls;
  Array Larges;
  Median = DetermineMedian(Set);
  Item.Value = Median;
  if(Set.Count() == 1)
    return;  
  for (int i = 0; int i < Set.Count(); i++)
  {
    if(Set[i] < Median)
    {
      Smalls.new(Set[i]);
    }
    else
    {
      Larges.new(Set[i]);
    }
  }
  Item.Lower = new TreeItem;
  Item.Upper = new TreeItem;
  BuildTreeItem(TreeItem.Lower, Smalls);
  BuildTreeItem(TreeItem.Upper, Larges);
}
Odpovězeno 21/01/2011 v 01:13
zdroj uživatelem

hlasů
0

Pokud to není domácí nejjednodušší řešení by bylo jako první třídit data a potom vytvořit strom pomocí prostředního položky jako root a sestupují dolů každou polovinu. Způsob navržený Xaade je podobný , ale mnohem pomaleji kvůli DetermineMedian složitosti .

Druhou možností je, aby skutečně podívat se na algoritmech, které staví vyvážené stromy (jako http://en.wikipedia.org/wiki/Red-black_tree ), aby zjistil, jestli to vyhovuje vašim požadavkům.

EDIT: odstranění nesprávné prohlášení o rychlosti Xaade algoritmu - to je vlastně tak rychle, jak quicksort (n log n - zkontrolovat každý prvek na každé úrovni rekurze s log n úrovní rekurze), není si jistý, proč jsem se odhaduje, že pomalejší.

Odpovězeno 21/01/2011 v 02:42
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more