Bir ağacın yüksekliğini hesaplayın

oy
3

Bir ağacın yüksekliğini hesaplamak çalışıyorum. Ben aşağıda yazılı kodu ile doint ediyorum.

#include<iostream.h>

struct tree
{
    int data;
    struct tree * left;
    struct tree * right;
};

typedef struct tree tree;

class Tree
{
private:
    int n;
    int data;
    int l,r;
public:
    tree * Root;
    Tree(int x)
    {
        n=x;
        l=0;
        r=0;
        Root=NULL;
    }
    void create();
    int height(tree * Height);

};

void Tree::create()
{
    //Creting the tree structure
} 

int Tree::height(tree * Height)
{
    if(Height->left==NULL && Height->right==NULL)
    {return 0;
    }
    else
    {
        l=height(Height->left);
        r=height(Height->right);

        if (l>r)
        {l=l+1;
        return l;
        }
        else
        {
            r=r+1;
            return r;
        }
    }
}

int main()
{
    Tree A(10);//Initializing 10 node Tree object
    A.create();//Creating a 10 node tree

    cout<<The height of tree<<A.height(A.Root);*/

}

Bana corret sonuç verir. Ama içinde bazı mesajların (googled sayfa) Bir postorder geçişi yapın ve Yükseklik hesaplamak için bu yükseklik yöntemi kullanmak önerildi. Herhangi belirli bir neden?

Oluştur 17/02/2010 saat 09:07
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
2

Ağacın yüksekliği kastetmek ile değişmez. Bu sabit kalır. Bu kastetmek bağlı olarak değişir düğümlerin bölüm.

Cevap 17/02/2010 saat 09:17
kaynak kullanıcı

oy
14

Ama bir postorder geçişi ne yaptığını tam olarak değil mi? Sol varsayarsak ve sağ Ne ilk, hem boş olmayan vardır height(left), sonra height(right)şimdiki düğümünde sonra bazı işleme ve. Bu bana göre postorder geçişi var.

Ama bu gibi yazmak istiyorum:

int Tree::height(tree *node) {
    if (!node) return -1;

    return 1 + max(height(node->left), height(node->right));
}

Düzenleme: ağaç yüksekliğini tanımlamak biçimine bağlı olarak, (boş bir ağaç) temel durum 0 olması veya -1 olmalıdır.

Cevap 17/02/2010 saat 09:19
kaynak kullanıcı

oy
2

Dan Tanımlar wikipedia .

Ön Sipariş (derinlik ilk):

  1. kök ziyaret edin.
  2. sol alt ağacı Traverse.
  3. Sağ alt ağaç Traverse.

(Simetrik) Inorder:

  1. sol alt ağacı Traverse.
  2. kök ziyaret edin.
  3. Sağ alt ağaç Traverse.

postorder:

  1. sol alt ağacı Traverse.
  2. Sağ alt ağaç Traverse.
  3. kök ziyaret edin.

tanımlarında "Ziyaret" "düğümün yüksekliğini hesaplamak" anlamına gelir. senin durumunda hangi birini sıfır (sol ve sağ olan boş ikisi) veya çocukların 1 + kombine yüksekliğidir.

senin uygulamasında, önemli değil geçişi sırası, bu aynı sonuçları verecek. Cant gerçekten postorder tercih etmektir belirten kaynağınla sana bir link vermeden daha fazla bir şey söyle.

Cevap 17/02/2010 saat 09:27
kaynak kullanıcı

oy
4

düğümlerin en az birinin tek çocuk sahip olduğu kod ağaçlarda başarısız olur:

// code snippet (space condensed for brevity)
int Tree::height(tree * Height) {
    if(Height->left==NULL && Height->right==NULL) { return 0; }
    else {
        l=height(Height->left);
        r=height(Height->right);
//...

Ağaç iki düğüm (kök ve sol veya sağ alt ya) birinci şartı yerine olmayacaktır kökündeki yöntemini çağırarak varsa (alt ağaçlar en az birinin boş olmayan) ve hem çocuklar üzerinde ardışık arayacak. Bunlardan biri boş, ama yine de null işaretçi KQUEUE gerçekleştirmek olacaktır if.

Doğru çözüm tarafından gönderildi biridir Hans burada. Her halükarda sizin yöntem değişmezler ne seçmek zorunda: Ya argümanı null aramalar izin ve incelikle illâ boş olmayan ve boş göstericilerle yöntemini çağırmayın garanti olması için argüman gerektiren durumun üstesinden .

Eğer harici kod boş işaretçiler geçmek olmaz garanti edemez çünkü (yöntem kodda olduğu gibi herkese açıktır) Tüm giriş noktalarını kontrol etmiyoruz eğer ilk vaka daha güvenlidir. İkinci çözüm (referansa imza değişen, ve ona bir üyesi yöntemi yapma treetüm giriş noktaları kontrol edebilirsiniz eğer sınıfın) temizleyici (veya değil) olabilir.

Cevap 17/02/2010 saat 09:40
kaynak kullanıcı

oy
0

İşte cevabı:

int Help :: heightTree (node *nodeptr)
{
    if (!nodeptr)
        return 0;
    else
    {
        return 1 + max (heightTree (nodeptr->left), heightTree (nodeptr->right));
    }
}
Cevap 18/02/2015 saat 20:02
kaynak kullanıcı

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