2016-03-29 14 views
-3

Bir düğümü ikili bir ağaca eklemek için aşağıdaki yöntemi yinelemeli olarak yazmayı denedim. Strateji, düğümü temelde herhangi bir NULL sol veya sağ işaretçiye yerleştirmekti. Ana işleviYinelemeli olarak binaryTree öğeye ekleme

InsertElementInBinaryTree(&root , new BinaryTreeNode{8, NULL,NULL});

sorunu hata özyinelemede olduğuna inanıyoruz böylece bu çağrı her zaman segmentasyon hatası hata döndürür olmasıdır aşağıdaki şekilde

typedef struct BinaryTreeNode { 
int data; 
BinaryTreeNode * left; 
BinaryTreeNode * right; 
} BinaryTreeNode; 

void InsertElementInBinaryTree(BinaryTreeNode *root, BinaryTreeNode *element) { 
    if(root) { 
     if(root -> left == NULL) root -> left = element; 
     else if(root -> right == NULL) root -> right = element; 
     InsertElementInBinaryTree(root -> left, element); 
     InsertElementInBinaryTree(root -> right, element); 
    } 
} 

yöntemi denir? Sonra ikili ağaç uygulamak için herhangi bir geçerli düğüm için sol alt ağacın tüm düğümler cari düğümünde data daha data düşük olması ve tüm gereken çalışıyorsanız

 if (root->data > element->data) { 
     if (root->left == NULL) { 
      root->left = element; 
     } else { 
      InsertElementInBinaryTree(root->left, element); 
     } 
    } else { 
     if (root->right == NULL) { 
      root->right = element; 
     } else { 
     InsertElementInBinaryTree(root->right, element); 
      } 
    } 
+0

Bağlantılı listeler ve ağaçlar gibi dinamik yapıları kullanırken, herhangi bir veriyi depolayabilmeniz için öbekte depolamak üzere ** malloc() ** kullanmanız gerekir. Ayrıca uygulamadan çıkmadan önce ** ücretsiz() ** gerekir, aksi takdirde uygulamanızın tekrar tekrar kullanılması tüm yığın belleği kullanılamaz hale getirir. –

cevap

0

Bazı koşullar kaçırıyorsun Sağ alt ağaçtan data daha büyük olmalıdır.

void InsertElementInBinaryTree(BinaryTreeNode *&root, BinaryTreeNode *element) { 
    if(root == NULL) { root = element; return;} 
    if(root -> data > element -> data) 
     InsertElementInBinaryTree(root->left, element); 
    else 
     InsertElementInBinaryTree(root->right, element); 
} 

Yani aslında data değerleri element eklenir olacak pozisyonunu tanımlar. Ayrıca root işaretçisinin değiştirilebilir olması için BinaryTreeNode *&root referans olarak geçiyorum.

Kullanımı:

// declare root 
BinaryTreeNode* root; 
// insertion, no & operator before root 
InsertElementInBinaryTree(root, new BinaryTreeNode{8, NULL,NULL}); 
0

:

0

fonksiyonu aşağıdaki şekilde

void InsertElementInBinaryTree(BinaryTreeNode * &root, int data) 
{ 
    if (root == nullptr) 
    { 
     root = new BinaryTreeNode { data, nullptr, nullptr }; 
    } 
    else if (data < root->data) 
    { 
     InsertElementInBinaryTree(root->left, data); 
    } 
    else 
    { 
     InsertElementInBinaryTree(root->right, data); 
    } 
} 

bakmak ve

InsertElementInBinaryTree(root , 8); 

ve nesne root

01 gibi başlangıçta tanımlanmış olmalıdır gibi adlandırılan olabilir
İlgili konular