Şimdi Ara

ağaç yapısında dolaşma

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
3
Cevap
0
Favori
1.113
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • // agac yapısında dolasma
    #include "stdafx.h"
    #include <iostream>
    #include <cstdlib>
    #include <stdio.h>
    #include <stdlib.h>


    using namespace std;
    struct dugum
    {
    int sayi;
    dugum *sol;
    dugum *sag;
    }
    struct agac{
    dugum *kok;
    int elemansayisi;
    void agacolustur();
    void ekle(dugum *);
    void yazdir();
    void preorder(dugum *);
    void inorder(dugum *);
    void postorder(dugum *);
    }

    void agac::preorder(dugum *p){
    if(p){
    cout << p->sayi << " ";
    preorder(p->sol);
    preorder(p->sag);
    }
    }
    void agac::inorder(dugum *p){
    if(p){
    inorder(p->sol);
    cout << p->sayi << " ";
    inorder(p->sag);
    }
    }
    void agac::postorder(dugum *p){
    if(p){
    postorder(p->sol);
    postorder(p->sag);
    cout << p->sayi << " ";
    }
    }
    void agac::agacolustur(){
    kok = NULL;
    elemansayisi = 0;
    cout << "Agac olusturuldu ;) " <<endl;
    }

    void agac::ekle(dugum *eklenecek){
    bool eklendi = false;
    dugum *tara; dugum *yeni = new dugum;
    tara = kok;
    *yeni = *eklenecek; yeni->sol = NULL; yeni->sag = NULL;

    if(kok == NULL){
    kok = yeni;
    cout << "Ilk eleman eklendi ! (" << kok->sayi << ")"<<endl;
    elemansayisi++;
    return;
    }
    while((tara != NULL) && (!eklendi))
    {
    if( yeni->sayi < tara->sayi)
    {
    if(tara->sol != NULL) { tara = tara->sol; }
    else
    {
    cout << tara->sayi << " dugumunun soluna " << yeni->sayi << " elemanini ekledim" << endl;
    tara->sol = yeni;
    eklendi = true;
    }
    }
    else if ( yeni->sayi > tara->sayi)
    {
    if(tara->sag != NULL) tara = tara->sag;
    else
    {
    cout << tara->sayi << " dugumunun sagina " << yeni->sayi << " elemanini ekledim " << endl;
    tara->sag = yeni;
    eklendi = true;
    }
    }else { cout << "Kopya" << endl; return;}
    }
    if(eklendi == true) { elemansayisi++; }
    cout << "Eleman sayisi : " << elemansayisi << endl ;
    cout << "PREORDER :\t\t"; preorder(kok);
    cout << endl;
    cout << "INORDER :\t\t"; inorder(kok);
    cout << endl;
    cout << "POSTORDER :\t\t"; postorder(kok);
    cout << endl;
    }

    int main(){
    typedef agac veriyapisi;
    veriyapisi kayit;
    dugum yenikayit;
    kayit.agacolustur();

    for(int i=1;i<10 ;i++){
    cout << endl << "Eleman : ";
    cin>>yenikayit.sayi;
    kayit.ekle(&yenikayit);
    }

    system("pause");
    return 0;
    }

    arkadaşlar merhaba dolaşma kodunu c++ ta yazdım ancak dolasma kısmı olan void agac::preorder(dugum *p){
    if(p){
    cout << p->sayi << " ";
    preorder(p->sol);
    preorder(p->sag);
    }
    }
    void agac::inorder(dugum *p){
    if(p){
    inorder(p->sol);
    cout << p->sayi << " ";
    inorder(p->sag);
    }
    }
    void agac::postorder(dugum *p){
    if(p){
    postorder(p->sol);
    postorder(p->sag);
    cout << p->sayi << " ";
    }
    kısmı copy paste yaptım bu kısmı bana acıklayabilecek biri olursa sevinirim sunum yapıcam cünkü [code][/code]







  • Öncelikle recursion (özyineleme) nedir ne değildir bilmiyorsan önce onu öğrenmelisin yoksa anlayamazsın bu tarz bir dolaşma fonksiyonunu.

    Eğer biliyorsan yapılan şey şudur:

    preorder üzerinden gidelim. preorder olarak gezmek demek önce root'u ziyaret etmek daha sonra sol çocuğu sonrasında da sağ çocuğu ziyaret etmek anlamına gelir. Yani ağacımız şöyle bir yapıdaysa
     
    5
    / \
    3 7


    Bu durumda ziyaret sırası şudur: 5-3-7. Peki ya 3 ve 7 nin de kendi çocukları olsaydı? O zaman ne yapacaktık? Mantık yine aynı kalıyor. Önce 5 ziyaret ediliyor, sonra da sol çocuk. Ancak sol çocuk da bu durumda başlı başına bir ağaç. Aynı kural ona da uygulanıyor ta ki sol çocuk tükenene dek. Örneğin:

     
    5
    / \
    3 7
    / \ / \
    1 4 6 8


    şeklinde bir ağaçta gezinirken aynı mantık ile önce 5 i sonra sol çocuğu ziyaret edelim diyoruz. Sol çocuk da başlı başına bir ağaç olduğu için aynı kuralı ona da uyguluyoruz. Yani önce 3 daha sonra 1 ve 4 ziyaret ediliyor sol çocukta. Buradan hareketle preorder ziyaret sırası şöyle oluyor:

    5-3-1-4-7-6-8

    Senin kullandığın fonksiyon da tam olarak bu işi yapıyor. Tek fark bizim ziyaret etmek olarak adlandırdığımız fonksiyon sende outputa yazdırmak. Dolayısıyla önce:

    cout << p->sayi << " "; ----> bu fonksiyon ile rootdaki eleman ekrana yazılıyor.
    preorder(p->sol); ----> bu fonksiyon ile gezinmeye sol çocuktan devam et diyoruz. (dikkat burda recursion(özyineleme) var)
    preorder(p->sag); ----> bu fonksiyon da sağ taraftaki çocuğu gezmek için.

    Dikkat edilirse "preorder(p->sag);" komutunun çalışması için öncelikle "preorder(p->sol);" komutu işini bitirmeli. Bu da ancak sol tarafta gezecek hiçbir eleman kalmamasıyla mümkün. Diğer gezinme türlerini de sana bırakıyorum.



    < Bu mesaj bu kişi tarafından değiştirildi dogauzun -- 19 Aralık 2012; 18:58:56 >




  • Bu ikili ağaç yanlız. İsmi ona göre verirsen iyi olur bu şekilde yanıltıcı olmuş. C++ ile yazmışsın ama c usülü gitmişsin. Düğümü ağacın içine private olarak alırsan daha uygun olur çünkü düğüme dışardan erişim olmamalı. Birde ben c tipi nesneleri struct, üye fonksiyonu olanları class olarak yazarım. Sana da böyle tavsiye ederim. typedef'e de gerek yok.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.