2015-12-06 3 views
0

я продолжаю получать ошибки сегментации (дамп ядра) из следующих строк:ошибки сегментации симметричного обхода

void inOrder(){ 
     if(this->isNull()) 
      return ; 
     this->left->inOrder(); 
     cout<<this->key<<' '; 
     this->right->inOrder(); 
} 

для того же входа иногда эта функция показывает, что, как предполагается, но в большинстве случаев просто выдаёт ошибку сегментации. им вполне уверен, что его функция не из-за IsNull():

bool isNull(){ 
     return this->null; 
    } 

где нуль является частным BOOL инициализируется истинными pseudoconstructor весь код можно посмотреть здесь: http://pastebin.com/RiiwqY3K Спасибо :).

+0

Если левое или правое значение равно нулю, то 'left-> inOrder()' или 'right-> inOrder()' приведет к его – DBug

+0

Что происходит, если 'left' или' right' '' NULL'? Затем вы разыскиваете нулевой указатель. –

+0

Если вы прокомментируете звонок баланса в своей вкладке, это поможет? Я думаю, что есть некоторая проблема с функцией rotateLeft и rotateRight. Не уверен, что это. Кроме того, я не понимаю, зачем передавать дерево, чтобы rotateRight, если не использовать его. – shengy

ответ

1

Рассмотрим случай, когда есть узел (пусть это будет корневой узел), который не имеет left ребенка, поэтому,

root->left = NULL

Так что, когда вы звоните this->left->inOrder() вы вызываете функцию на нулевом указателе (разыменование нулевого указателя), который является ошибкой сегментации!

Таким образом, вы точно не нужны isNull функции для проверки, вам просто нужно добавить if условия, прежде чем вызывать inOrder что-то вроде этого ::

if(this->left != NULL) 
    this->left->inOrder(); 

Аналогичны для right поддерева. Я предполагаю, что вы явно обрабатываете случай, когда корень дерева NULL, main вызывается , поэтому перед вызовом этой функции вы также устанавливаете условие if в main (или в любом месте).

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