ايران ويج

نسخه‌ی کامل: جستجوی درخت دودویی با دلفی؟؟؟؟
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
دورود
کسی سورسی واسه جستجوی درخت دودویی به زبان دلفی داره؟
میخوام یه عدد رو از این طریق پیدا کنم این سایت هم کامل توضیح داده
http://www.algorithmha.ir/post-%D8%AF%D8...DB%8C.aspx
روش کار رو بلدم تا حدودی هم اجراش کردم و هنوز نتونستم کاملش کنم دوستان اگه سورس کاملی دارن سپاسگذار میشم
کاش سورست رو گذاشته بودی

http://delphi.wikia.com/wiki/Basic_Binary_Tree

بعد لطف کن بگو
pre یا in یا pos
کدوم روش رو میخوای برای پیمایش یا سرچ
بالا توضیح دادم محمد جان
من قسمت سرچ رو میخوام
نمونه سورسی هم که خودم نوشتم اینه:

کد:
procedure TForm1.Button1Click(Sender: TObject);
var
Max,x,y,z : integer;

begin
       Max:=256;
       x:=17;

while true do
  begin
       if Max > x then
        begin
         y:=Max;
         Max:=Max div 2;
         z:=Max ;
         Memo1.Lines.Add(IntToStr(Max));
        end else break;
  end;


  // marhale dovom az inja shoroo mishe ke jostejoo beyne y ,z hast
  memo2.Lines.Add(inttostr(y));
  memo2.Lines.Add(inttostr(z));
end;

البته مرحله اول رو مطمئنم که درست رفتم مرحله بعدی هم تو خط آخر تگ کردم و توضیح دادم
تو سورس بالا جستجوی من بین 1 و 256 هست که عدد 17 رو جستجو میکنه و نتایج جستجو همزمان توی ممو اضافه میشه
والا مهندس جان این کار کلا اشتباه هست. البته شما استاد ما هستی.
ولی من یه چند تا چیز هست باید بگم.
یک این الان تو درخت نیست.چون درخت چپ و راست داره. این که شما نوشتی شبیه دودویی در آرایه هست.
بازم اگر منظور شما دودویی آرایه باشه هم باز کد بالا اشتباه هست.چون تقریبا چند برابر داره اضافه محاسبه انجام میده.

باز در آخر بگم شما استاد مایی ما جسارت کردیم.
میدونم اما این نصف مرحله هست نه کل مراحل این فقط مرحله اول هست
شاید بهم بخندین ولی چند روزیه که دیگه مغزم نمیکشه بچه ها شاید دیگه هیچ وقت نتونم کد بزنم
کدی که میخواستم این بود که خودم نوشتمش
کد:
procedure TForm1.Button2Click(Sender: TObject);
const
Bal :  array [1..7] of integer  = (1,32,16,8,4,2,1);
var
i,x,h:integer;
begin
x:=128;
h:=64;
      while true do
       begin
        for i:=Low(Bal) to High(Bal) do
          begin
            if (h+Bal[i]) <= x then
             begin
             h:=h+Bal[i];
             memo1.Lines.Add(inttostr(h));
             if x = h then break;
            end;
          end;
        if x = h then break;
     end;
end;

این کد رو واسه انجین Blind Sql Injection میخواستم که نوشتمش الانم دارم بهینش می کنم
نقل قول: Blind Sql Injection
مردم از همیشه بهتر کد میزنن. بعد میگن ما نمی تونیم کد بزنیم.
کاش ما هم نمی تونستیم کد بزنیم.
با سلام. Biggrin


اولين اطلاعات ورودي در ريشه قرار مي گيرد
اطلاعات دوم با ريشه مقايسه شده چنان چهخ کوچک تر از آن باشد در سمت چپ ريشه و گرنه در سمت راست ريشه قرار مي گيرد
اطلاعات بعدي ماننداطلاعات دوم با ريشه مقايسه مي شود چنان چه از آن کوچک تر باشد به سمت چپ و گرنه به سمت راست مي رود
در حرکت به سمت چپ يا راست به هر گره اي که رسيدند با آن گره مثل ريشه عمل مي کنند
عناصر مساوي در درخت قرار نمي گيرند

توجه داشته باشيد که در هر گره اي که هستيد مي توانيد آن را به عنوان ريشه درختي فرض کنيد که
خودش يک زير درخت سمت چپ و يم زير درخت سمت راست دارد
براي آشنايي با شيوه تشکيل درخت دودويي فرض کنيد اعداد زير بايد در درخت قرار گيرند

11 19 4 14 9 2 18


پس از قرار گرفتن اين اعداد در درخت شکل زير درست مي شود
ابتدا عدد يازده وارد شده در ريشه قرار مي گيرد
سپس عدد نوزده وارد مي شود چون بزرگ تر از يازده است در سمت راست آن قرار مي گيرد
سپس عدد چهار وارد مي شود چون از يازده کوچک تر است به سمت چپ مي رود
چون عدد چهارده از يازده بزرگ تر است و در سمت راست مي رود و با نوزده مقايسه مي شود
از آن کوچک تر است و در سمت چپ قرار مي گيرد
عدد نه از يازده کوچک تر است و به سمت چپ مي رور و با چهار مقايسه مي شود
از آن بزرگ تر است و در سمت راست آن قرار مي گيرد
عدد دو از يازده کوچک تر است و به سمت چپ مي رود با چهار مقايسه مي شود
از آن کوچک تر است و در سمت چپ آن قرار مي گيرد
عدد هيجده از يازده بزرگ تر است به سمت راست مي رود و با نوزده مقايسه مي شود از آن کوچک تر است به سمت چپ مي رود
و با چهارده مقايسه مي شود از آن بزرگ تر است و در سمت راست آن قرار مي گيرد

کد:
11

                        4                  19

                    2       9         14

                                           18

ساختار درخت

Type Tree = ^Rec;
     Rec = Record
       Name :  String;
       No : Integer;
       Left : Tree;
       Right : Tree;
     end;
var
  P,S : Tree;




درج در درخت دودويي

New(P);
P^.Left = nil;
P^.Right = nil;
  if (S = nil) then
     S = P;
  else  if (P^.no > S^.no) then
           S^.Right = P;
        else
           S^.Left = P;




پيمايش درخت يک

ملاقات زير درخت سمت چپ
ملاقات ريشه
ملاقات زير درخت سمت راست

Procedure  Inorder(S:Tree)
begin
  if S = nil then
    Exit;
  Inorder(S^.Left);
  Inorder(S^.NO);
  Inorder(S^.Right);
end;



پيمايش درخت دو

ملاقات ريشه
ملاقات زير درخت سمت چپ
ملاقات زير درخت سمت راست

Procedure  Preorder(S:Tree)
begin
  if S = nil then
    Exit;
  Write(S^.NO);
  Preorder(S^.Left);
  Preorder(S^.Right);
end;




پيمايش درخت سه

ملاقات زير درخت سمت چپ
ملاقات زير درخت سمت راست
ملاقات ريشه

Procedure  Postorder(S:Tree)
begin
  if S = nil then
    Exit;
  Postorder(S^.Left);
  Postorder(S^.Right);
  Write(S^.NO);
end;

--------------------------------------------------------------------------------

Type
  Heap = ^Tree;
  Tree = Record
  Nod : Integer;
  Right : Heap;
  Left : Heap;
End;

var
  First : Heap = Nil;


Procedure Add(X:Integer);  //  11  19  4  14  9  2  18
var
  Temp : Heap;
  K : Heap;
  Label L1,L3;
Begin
New(Temp);

if First = Nil then
   begin
     Temp^.Nod:=X;
     Temp^.Right:=Nil;
     Temp^.Left:=Nil;
     First:=Temp;
   end
else
   begin
      K:=First;

      L1: if (K^.Nod < X) then
             begin
               if K^.Right = Nil then
                 begin
                   Temp^.Nod:=X;
                   Temp^.Right:=Nil;
                   Temp^.Left:=Nil;
                   K^.Right:=Temp;
                   GoTo L3;
                 end
               else if K^.Right <> Nil then
                 begin
                   K:=k^.Right;
                   GoTO L1;
                 end;
           end;

         if (K^.Nod > X) then
             begin
               if K^.Left = Nil then
                 begin
                   Temp^.Nod:=X;
                   Temp^.Right:=Nil;
                   Temp^.Left:=Nil;
                   K^.Left:=Temp;
                   GoTo L3;
                 end
               else if K^.Left <> Nil then
                 begin
                   K:=k^.Left;
                   GoTO L1;
                 end;
           end;
   end;
L3:
End;


Procedure Preorder(P:Heap);
Begin
  if P = nil then
   Exit;
  Form1.ListBox2.Items.Add(IntToStr(P^.Nod));
  Preorder(P^.Left);
  Preorder(P^. Right);
End;  //  11  4  2  9  19  14  18
ممنون ولی خودم از یه روش ابتکاری مشکل رو حلش کردم
کلا الگوریتم دیگه ای طراحی کردم و سریع تر از ساختار دودودیی درختی به نتیجه میرسه
به هر حال ممنون