Дерево выражения и способы его обхода

Три способа обхода бинарного дерева

Прототипы функций

Программа

#include <stdio.h>

#include <stdlib.h>

/* Описание бинарного дерева в виде регулярной сети */

// Тип вершины дерева (элемента сети)

struct TREE

{ float number; // число

struct TREE *left, *right; /* указатели на левое и правое поддеревья*/

};

void insert (struct TREE *pt, float x);

void print_tree (struct TREE *pt);

void delete_tree (struct TREE *pt);

/*--------------------------------------*/

/* Главная функция */

/*--------------------------------------*/

void main()

{ struct TREE *pt; // указатель на корень дерева

float x; // очередное число

puts ("\nВведите числовую последовательность");

scanf("%f", &x);

// создание корня дерева

pt = (struct TREE *) malloc (sizeof(struct TREE));

pt->number=x;

pt->left=pt->right=NULL;

// ввод чисел и формирование дерева while (scanf("%f", &x)!= EOF)

insert (pt,x);

// обход дерева и печать результата

puts ("Результат:");

print_tree (pt);

// удаление дерева

delete_tree (pt);

}

/*---------------------------------------------------------------------*/

/* Функция включения новой вершины в дерево */

/*---------------------------------------------------------------------*/

void insert (struct TREE *pt, float x)

// pt - указатель на корень дерева

// x – число - метка новой вершины

{ struct TREE *i, /* указатель на текущую вершину дерева */

*parent; /* указатель на вершину- родителя для новой вершины */

int dir; /* признак включения новой вершины

в левую или правую ветвь */

/* спуск по дереву и поиск вершины- родителя для новой вершины*/

i = pt;

while (i!= NULL)

{ parent = i;

if (x < i->number) { // спуск влево

i = i->left; dir = 0; }

else { // спуск вправо

i = i->right; dir = 1; } }

/* создание новой вершины */

i = (struct TREE *) malloc (sizeof (struct TREE));

i->number = x;

i->left = i->right = NULL;

/* включение новой вершины в левую или правую ветвь родителя*/

if (dir == 0) parent->left = i;

else parent->right = i; }

/*---------------------------------------------------------------------*/

/* Рекурсивная функция обхода дерева слева */

/* направо и печати его вершин */

/*---------------------------------------------------------------------*/

void print_tree (struct TREE *pt)

/* pt - указатель на корень дерева (поддерева) */

{ if (pt)

{ print_tree (pt->left);

printf ("%f ", pt->number);

print_tree (pt->right);

}

}

/*-----------------------------------------------------------------*/

/* Рекурсивная функция обхода дерева снизу */

/* вверх и удаления его вершин */

/*-----------------------------------------------------------------*/

void delete_tree (struct TREE *pt)

// pt - указатель на корень дерева (поддерева)

{ if (pt)

{ delete_tree (pt->left);

delete_tree (pt->right);

free (pt);

}

}

Прямой обход (обход сверху вниз):

1. Корень
2. Левое поддерево
3. Правое поддерево

Внутренний обход (обход слева направо):

1. Левое поддерево
2. Корень
3. Правое поддерево

Обратный обход (обход снизу вверх):

1. Левое поддерево
2. Правое поддерево
3. Корень


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: