Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2012, 22:48   #1
torren108
Пользователь
 
Регистрация: 28.09.2011
Сообщений: 17
По умолчанию Поиск предка 2-ух элементов бинарного дерева (Cи)

Вечер добрый. Нужно написать следующую программу: "по 2 выбранным пользователем элементам найти ближайшего общего предка". Изначально в задании было указанно дерево лишь с "правосторонним" ветвлением (т.е. "1(2,3(4, 5(6,7))), именно такой код и представлен ниже. Усложнили задание - добавили левую ветвь. Код был построен именно для правостороннего обхода (писал под диктовку старшекурсника, ибо с темой были проблемы => сам весьма смутно представляю как происходит поиск и сравнение). Подскажите, что нужно исправить, чтобы программа корректно работала с указанным в ней деревом?
ps: "AncF" - фун-ция поиска предка.
pps: в проекте еще 2 файла - заголовочный и сишник с main'ом. Если необходимо - тоже выложу.


Код:
#include "mylib.h"
struct node* newNode(int );

int AncF(struct node* root, int n1, int n2)
{
  if(root == NULL || root->data == n1 || root->data == n2)
    return -1; 
  if((root->right != NULL) && (root->right->data == n1 || root->right->data == n2))
    return root->data;
  if((root->left != NULL) && (root->left->data == n1 || root->left->data == n2))
    return root->data;    
  if(root->data > n1 && root->data < n2)
    return root->data;
  if(root->data > n1 && root->data > n2)
    return AncF(root->left, n1, n2);
  if(root->data < n1 && root->data < n2)
    return AncF(root->right, n1, n2);
}    
struct node* newNode(int data)
{
  struct node* node = (struct node*)malloc(sizeof(struct node));
  node->data  = data;
  node->left  = NULL;
  node->right = NULL;
  return(node);
}
void BracketTree(struct node *Root) //Вывод дерева
{
	if (Root)
	{
		printf("%d", Root->data);
		if ((Root->left != NULL) || (Root->right != NULL))
		{
			printf("(");
			BracketTree(Root->left);
			printf(",");
			BracketTree(Root->right);
			printf(")");
		}
	}
}
int run()
{
  int i,j;
  struct node *root  = newNode(1);
  root->left         = newNode(2);
  root->right        = newNode(3);
  root->right->left  = newNode(4);
  root->right->right = newNode(5);
  root->right->right->right = newNode(6);
  root->right->right->left = newNode(7);
  root->left->left = newNode(8);
  root->left->left->right = newNode(9);
  //root->right->left->right = newNode(8);
  //root->right->left->left = newNode(9);
  printf("\n You tree: \n");
  BracketTree(root); 
  printf("\n Введите первый элемент: \n");
  while(scanf("%d",&i)==0||i<0||i>10)
		return 0;
  printf("\n Введите второй элемент: \n");
  while(scanf("%d",&j)==0||j<0||j>10)
		return 0;
  printf("\n Ближайший общий предок: \n");
  printf("%d\n", AncF(root, i, j));
  getchar();
 }
torren108 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Высота бинарного дерева dido171 Помощь студентам 4 02.12.2014 13:30
Построение бинарного дерева LordAlex91 Общие вопросы C/C++ 2 18.02.2012 15:49
Haskell поиск пути от корня бинарного дерева до узла [x,y] Fill_x Помощь студентам 0 10.11.2011 18:34
Поиск суммы элементов дерева Sparky Помощь студентам 1 07.03.2010 16:12