Member 13096959 Ответов: 3

Я застрял с программой двоичного дерева поиска, не могу найти правильный вывод, помогите мне. Я отправляю программу в описании


#include<conio.h>
#include<process.h>
#include<stdlib.h>
#include<stdio.h>
struct bstnode{
	int data;
	struct bstnode* right;
	struct bstnode* left;
};
bstnode* getnewnode(int data){
	bstnode* newnode=(bstnode*)malloc(sizeof(struct bstnode));
	newnode->data=data;
	newnode->right=NULL;
	newnode->left=NULL;
	return newnode;
}
bstnode* insert(bstnode* root,int data){
	
	
	if(root==NULL) {
		root=getnewnode(data);
	}
	else if(data<=root->data){
			root->left=insert(root->left,data);
		}else{
			root->right=insert(root->right,data);
		}
	return root;
}
int search(bstnode* root,int data){
	if(root==NULL) return(-1);
	else if(root->data ==data) return(1);
	else if(data <= root->data) return search(root->left,data);
	else return search(root->right,data);
}
void main(){
	struct bstnode* root=NULL;
	root=insert(root,15);root=insert(root,10);root=insert(root,20);
	root=insert(root,25);root=insert(root,8);root=insert(root,12);
	int number;
	printf("\n enter no. to be searched \n ");
	scanf("&d",&number);
	if(search(root,number)==1) printf("found \n ");
	else printf("not found \n");
	getch();
}


Что я уже пробовал:

Я перепробовал все . помогать мне.

3 Ответов

Рейтинг:
1

Michael_Davies

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

else if(data<=root->data){
			root->left=insert(root->left,data);
		}else{
			root->right=insert(root->right,data);
		}


С учетом вышесказанного, если root- & gt;left уже имеет значение в нем, вы перезаписываете его, в то время как вам нужно пройти влево, пока вы либо не найдете существующий узел равным, либо он больше данных, а левый узел равен нулю, затем создайте новый узел и сохраните его в root->left.


Рейтинг:
0

CPallini

Попробуйте следующий код (и более современный компилятор)

#include<stdlib.h>
#include<stdio.h>
typedef struct tag_bstnode
{
  int data;
  struct tag_bstnode* right;
  struct tag_bstnode* left;
} bstnode;

bstnode* getnewnode(int data){
  bstnode* newnode=(bstnode*)malloc(sizeof(bstnode));
  newnode->data=data;
  newnode->right=NULL;
  newnode->left=NULL;
  return newnode;
}
bstnode* insert(bstnode* root,int data){


  if(root==NULL) {
    root=getnewnode(data);
  }
  else if(data<=root->data){
      root->left=insert(root->left,data);
    }else{
      root->right=insert(root->right,data);
    }
  return root;
}
int search(bstnode* root,int data){
  if(root==NULL) return(-1);
  else if(root->data ==data) return(1);
  else if(data <= root->data) return search(root->left,data);
  else return search(root->right,data);
}
int main(){
  bstnode* root=NULL;
  root=insert(root,15);root=insert(root,10);root=insert(root,20);
  root=insert(root,25);root=insert(root,8);root=insert(root,12);
  int number;
  printf("\n enter no. to be searched \n ");
  scanf("%d",&number);
  if(search(root,number)==1) printf("found \n ");
  else printf("not found \n");
  getchar();
  return 0;
}


Рейтинг:
0

Patrice T

Цитата:
Я перепробовал все

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

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.