2016-12-13 3 views
-1

Я работаю над библиотекой дерева двоичного дерева C, и я пытаюсь написать функцию, которая удалит правый узел древовидного дерева. Вот структура моего дерева:Удалить правый узел правого поддерева дерева двоичного поиска (C)

struct Node { 
    int value; 
    struct Node *left; 
    struct Node *right; 
}; 

typedef struct Node TNode; 
typedef struct Node *binary_tree; 

Дерево создается следующим образом:

binary_tree NewBinaryTree(int value_root) { 
    binary_tree newRoot = malloc(sizeof(TNode)); 
    if (newRoot) { 
     newRoot->value = value_root; 
     newRoot->left = NULL; 
     newRoot->right = NULL; 
    } 
    return newRoot; 
} 

Добавление элемента к нему:

void Insert(binary_tree *tree, int val) { 
    if (*tree == NULL) { 
     *tree = (binary_tree)malloc(sizeof(TNode)); 
     (*tree)->value = val; 
     (*tree)->left = NULL; 
     (*tree)->right = NULL; 
    } else { 
     if (val < (*tree)->value) { 
      Insert(&(*tree)->left, val); 
     } else { 
      Insert(&(*tree)->right, val); 
     } 
    } 
} 

Функция я написал, чтобы удалить правый узел поддерево выглядит следующим образом:

void delrightsubtree(binary_tree *tree){ 


     if((*tree)->value!=NULL) 

     { 
       free(&(*tree)->right); 
       delrightsubtree(&(*tree)->right); 
     } 
     else 
     { 
      printf("end"); 
     } 
    } 

Однако эта функция не работает, потому что она сбой при вызове этой функции (после добавления нескольких элементов в дерево). Я не знаю, как это сделать.

Спасибо!

+0

Возможный дубликат [Удалить узел из двоичного дерева C без испортить его] (http://stackoverflow.com/questions/41092850/delete-node-from-ac-binary-tree-without-messing-it- up) – Olaf

ответ

1

Возможно, вам захочется реализовать метод рекурсивного удаления (например, ваш метод вставки). Сейчас похоже, что вы вызываете free на одном узле, который не собирается выпускать какие-либо ресурсы, к которым он прикреплен (например, к своим дочерним элементам). Вместо этого подумайте об обходе части дерева, которую вы хотите удалить, и установив соответствующие значения в NULL.

+0

Я не совсем уверен в понимании. Не могли бы вы принять, например, мой метод Insert и изменить его для того, что вы имеете в виду? спасибо –

+0

У вас есть правильная идея с «Вставить»: чтобы вставить узел, скажите своему ребенку вставить его, пока мы не достигнем дна дерева. То же самое для 'Delete': для удаления ветви, сообщите вашим детям, чтобы они удаляли своих детей, пока не достигнете дна дерева. – Zexus

+0

Я отредактировал свое сообщение с функцией, которую я редактировал, она компилируется, но сбой при вызове функции –

0

Вы просто вызываете метод рекурсивного удаления до тех пор, пока не достигнете конца (нет следующей точки), тогда вы просто освободите все, что вам нужно, и установите для NULL вещи, которые предположительно будут установлены в нуль.

Смежные вопросы