Бинарные поисковые деревья

Содержание

Слайд 2

Словарные операции поиск элемента с заданным ключом х добавление нового элемента

Словарные операции

поиск элемента с заданным ключом х
добавление нового элемента с заданным

ключом х
удаление элемента с заданным ключом х

ФПМИ БГУ

Слайд 3

Бинарное поисковое дерево Поисковое 5. Каждой вершине поставлено в соответствие некоторое

Бинарное поисковое дерево

Поисковое
5. Каждой вершине поставлено в соответствие некоторое целое число

- ключ. Для каждой вершины v все ключи в её левом поддереве строго меньше ключа вершины v, а в правом – строго больше.

корень

n – число вершин
m=n-1 – число дуг

ФПМИ БГУ

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

Бинарное
4. Каждая вершина содержит не более 2-х сыновей.

Слайд 4

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

7

2

1

Построить бинарное поисковое дерево для последовательности элементов последовательным добавлением нового элемента:


ФПМИ БГУ

2, 1, 6, 4, 3, 10, 9, 8, 7, 18, 17, 14, 13, 11, 19, 20, 22, 23, 21

Слайд 5

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

7

2

1

ФПМИ БГУ

6

??? добавить

так как мы договорились (см. определение) , что

в дереве все ключи различны, то одинаковые элементы при добавлении будем игнорировать
Слайд 6

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

7

2

1

Высота вершины: длина наибольшего пути от вершины до одного из её

потомков.
высота (10) = 5
Высота дерева: высота корня.
высота (дерева) = 7

Глубина вершины: длина пути из корня в вершину (этот путь единственный).
глубина (10) = 2

Уровень вершины: высота дерева минус глубина вершины
уровень (10) = высота (дерева)- глубина (10) =7 – 2 = 5

ФПМИ БГУ

Высота, глубина, уровень

0-й уровень

1-й уровень

2-й уровень

7-й уровень

3-й уровень

4-й уровень

5-й уровень

6-й уровень

Слайд 7

Для полупути снимается ограничение на направление дуг. Пример полупути, соединяющего вершины

Для полупути снимается ограничение на направление дуг.
Пример полупути, соединяющего вершины 1

и 7: 1 - 2 - 6 - 10 - 9 - 8 - 7

ФПМИ БГУ

Путь, полупуть

Слайд 8

Центральная вершина полупути - такая вершина, что количество вершин в полупути

Центральная вершина полупути -
такая вершина, что количество вершин в полупути до

неё равно количеству вершин после неё.

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

Что делать, если число вершин, среди которых надо найти центральную или среднюю ЧЁТНО?

ФПМИ БГУ

Центральная и средняя вершины полупути

?

центральной и средней вершины НЕ СУЩЕСТВУЕТ

центральная

средняя

Слайд 9

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

Наибольшим полупутём в дереве будем называть полупуть наибольшей длины (напомним, что

длина пути измеряется в рёбрах, а не вершинах).

ФПМИ БГУ

Корнем полупути назовём вершину полупути с самой большой высотой.
На рис. выделены два наибольших полупути и у них общий корень 18.

Слайд 10

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

2

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

2

Пример.
1) Длина наибольшего полупути?
2) Какие вершины являются корнями полупутей

наибольшей длины?
3) Сколько попарно различных полупутей наибольшей длины проходит через вершину 18?

ФПМИ БГУ

=5

=8

=18 и 6

Слайд 11

прямой (левый, правый) - PreOrderTraversal (v) ФПМИ БГУ Обходы обратный (левый,

прямой (левый, правый) - PreOrderTraversal (v)

ФПМИ БГУ

Обходы

обратный (левый, правый) - PostOrderTraversal

(v)

внутренний (левый, правый) - InOrderTraversal (v)

Время выполнения обхода: пропорционально числу вершин в дереве (=n)

Слайд 12

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

2

1

7

прямой левый обход
def PreOrderTraversal (v):
if v is not None:
Action

(v)
PreOrderTraversal (v.left)
PreOrderTraversal (v.right)

прямой правый обход
def PreOrderTraversal (v):
if v is not None:
Action (v)
PreOrderTraversal (v.right)
PreOrderTraversal (v.left)

прямой левый обход

прямой правый обход

2, 1, 6, 4, 3, 10, 9, 8, 7, 18, 17, 14, 13, 11, 19, 20, 22, 21, 23

2, 6, 10, 18, 19, 20, 22, 23, 21, 17, 14, 13, 11, 9, 8, 7, 4, 3, 1

ФПМИ БГУ

Слайд 13

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

2

1

7

обратный левый обход
def PostOrderTraversal (v):
if v is not None:
PostOrderTraversal

(v.left)
PostOrderTraversal (v.right)
Action (v)

обратный правый обход
def PostOrderTraversal (v):
if v is not None:
PostOrderTraversal (v.right)
PostOrderTraversal (v.left)
Action (v)

обратный левый обход

обратный правый обход

1 ,3, 4, 7, 8, 9, 11, 13, 14, 17, 21, 23, 22, 20, 19, 18, 10, 6, 2

23, 21, 22, 20, 19, 11, 13, 14, 17, 18, 7, 8, 9, 10, 3, 4, 6, 1, 2

ФПМИ БГУ

Слайд 14

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

3

4

6

8

9

2

1

7

внутренний левый обход
def InOrderTraversal (v):
if v is not None:
InOrderTraversal

(v.left)
Action (v)
InOrderTraversal (v.right)

внутренний правый обход
def InOrderTraversal (v):
if v is not None:
InOrderTraversal (v.right)
Action (v)
InOrderTraversal (v.left)

внутренний левый обход
(ключи отсортированы по возрастанию)

внутренний правый обход
(ключи отсортированы по убыванию)

1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 17, 18, 19, 20, 21, 22, 23

23, 22, 21, 20, 19, 18, 17, 14, 13, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1

ФПМИ БГУ

Слайд 15

ФПМИ БГУ Примеры задач Найти высоту дерева. Определить, является ли дерево

ФПМИ БГУ

Примеры задач

Найти высоту дерева.
Определить, является ли дерево сбалансированнным по высоте.
Найти

длину наибольшего полупути (корни полупутей наибольшей длины).
Проверить, является ли дерево идеально-сбалансированным по числу вершин.
Найти среднюю по значению вершину в дереве.
Найти среднюю по значению вершину среди вершин, у которых высоты поддеревьев совпадают.
Найти среднюю по значению вершину среди вершин некоторого пути.
Слайд 16

7 0 0 1 3 4 3 2 0 0 1

7

0

0

1

3

4

3

2

0

0

1

1

Обратный левый (или правый) обход

если вершина v лист, то её высота

равна 0;
если у вершины v только одно поддерево, то её высота равна высоте этого поддерева +1;
если у вершины v есть оба поддерева, то её высота равна максимуму из высот поддреревьев, увеличенному на 1.

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

2

5

6

Найти высоту дерева.
Определить, является ли дерево сбалансированнным по высоте (для всех вершин высоты их подеревьев должны отличаться не более, чем на 1.

ФПМИ БГУ

Нужно знать высоту каждой вершины.

Слайд 17

0 0 1 0 1 2 3 0 1 2 4

0

0

1

0

1

2

3

0

1

2

4

5

6

7

3

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

Зная метки высот, можно найти длину наибольшего полупути и его корень:


Вершина 18: 3+3+2=8
является корнем наибольшего полупути.
Длина наибольшего полупути равна 8.

3) Найти длину наибольшего полупути (корни полупутей наибольшей длины).

ФПМИ БГУ

найдём ту вершину v, для которой сумма меток высот её поддеревьев, увеличенная на число 2 или 1 (в зависимости от того, сколько поддеревьев у вершины v), является наибольшей.

Слайд 18

0 1 0 0 0 1 2 3 1 2 4

0

1

0

0

0

1

2

3

1

2

4

5

6

7

3

0

2

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

3) Найти длину наибольшего полупути и указать корни полупутей наибольшей длины.

ФПМИ

БГУ

1

7

Вершины 2, 10, 18 являются корнями полупутей наибольшей длины 8.

Вопрос 1.Сколько полупутей наибольшей длины проходит через вершины?
1
2
10
18
19

Вопрос 2. Через какие вершины пройдёт наибольшее число полупутей наибольшей длины?

Слайд 19

1 2 1 1 1 2 3 4 3 4 10

1

2

1

1

1

2

3

4

3

4

10

13

14

15

5

если вершина v лист, то её метка равна 1;
если у вершины

v только одно поддерево, то её метка равна метке этого поддерева +1;
если у вершины v есть оба поддерева, то её метка равна сумме меток поддеревьев, увеличенной на 1.

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

4) Проверить, является ли дерево идеально-сбалансированным по числу вершин: для каждой вершины число вершин в поддеревьях должно отличаться не более, чем на 1 (для простоты вычислений, если у вершины отсутствует поддерево, то число вершин в таком поддереве полагается равным 0).

ФПМИ БГУ

Нужно знать число вершин в каждом поддереве.

Обратный левый (или правый) обход

Слайд 20

1 2 3 4 5 6 7 8 Выполнить любой обход

1

2

3

4

5

6

7

8

Выполнить любой обход дерева и подсчитать число вершин (n=15).
Если n

– чётно, то полагаем, что средней не существует.
Если n – нечётно, то выполним внутренний обход, считая пройденные во время этого обхода вершины. Остановимся, как только счётчик пройденных вершин станет равным [n/2]+1 (=8).

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

ФПМИ БГУ

5) Найти среднюю по значению вершину в дереве
(не использовать дополнительную память, зависящую от n, решить задачу за линейное от количества вершин время).

Сначала нужно узнать, чётно или нет число вершин в дереве.
Если число вершин нечётно, то средняя вершина существует и её можно найти, просматривая вершины дерева, например, по неубыванию ключей.

на рис. показана нумерация вершин при внутреннем обходе (красные числа):

def InOrderTraversal (v):
if v is not None:
InOrderTraversal (v.left)
Action (v)
InOrderTraversal (v.right)

Слайд 21

Сначала обратным обходом расставить вершинам метки высот. Во время этого же

Сначала обратным обходом расставить вершинам метки высот. Во время этого же

обхода подсчитать количество вершин, у которых метки высот поддеревьев совпали. Пусть у нас m таких вершин.
Если m – чётно, то средней не существует.
Если m – нечётно, то выполним внутренний обход, считая при этом только лишь те вершины, для которых высоты их поддеревьев совпадают. Остановимся, как только счётчик станет равным [m/2]+1.

18

23

22

20

19

11

12

14

17

0

1

2

4

3

3

2

1

0

21

0

13

0

ФПМИ БГУ

6) Найти среднюю по значению вершину среди вершин, у которых высоты поддеревьев совпадают.

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

Внутренний (левый) обход:
11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23

Слайд 22

m i a t u s b p f вершина t

m

i

a

t

u

s

b

p

f

вершина t является средней по значению

f

p

m

i

b

s

u

t

ФПМИ БГУ

7) Найти среднюю по значению

вершину среди вершин некоторого пути.
Предположим, что задан корень этого пути.
Слайд 23

Удаление вершины ФПМИ БГУ Случай 1. Удаляется лист. Случай 2. Удаляется

Удаление вершины

ФПМИ БГУ

Случай 1. Удаляется лист.

Случай 2. Удаляется вершина, у которой

есть только одно поддерево

Случай 3. Удаляется вершина, у которой есть оба поддерева (возможно «правое» или «левое» удаление).

Слайд 24

ФПМИ БГУ Случай 1. Удаляется лист.

ФПМИ БГУ

Случай 1. Удаляется лист.

Слайд 25

ФПМИ БГУ Случай 2. Удаляется вершина, у которой есть только одно поддерево.

ФПМИ БГУ

Случай 2. Удаляется вершина, у которой есть только одно поддерево.

Слайд 26

ФПМИ БГУ Случай 2. Удаляется вершина, у которой есть только одно поддерево

ФПМИ БГУ

Случай 2. Удаляется вершина, у которой есть только одно поддерево

Слайд 27

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

правое удаление
вершины 10

11

18

23

21

22

20

19

13

14

17

6

8

9

2

12

11

ФПМИ БГУ

Случай 3. Удаляется вершина, у которой есть

оба поддерева ( «правое» удаление).
Слайд 28

10 18 23 21 22 20 19 11 13 14 17

10

18

23

21

22

20

19

11

13

14

17

6

8

9

2

левое удаление
вершины 10

9

18

23

21

22

20

19

13

14

17

6

8

2

12

9

ФПМИ БГУ

Случай 3. Удаляется вершина, у которой есть оба

поддерева ( «левое» удаление).
Слайд 29

!!! Если у удаляемой вершины только одно поддерево, то НЕТ ПОНЯТИЯ

!!! Если у удаляемой вершины только одно поддерево, то НЕТ ПОНЯТИЯ

ПРАВОЕ/ЛЕВОЕ
удаление. Удаление всегда выполняется однозначно.

Найти вершину, которая удовлетворяет заданному свойству.
Удалить эту вершину (правое удаление).

?

(рис.1)

или

ФПМИ БГУ

(рис.2)

Ответ: правильно выполнено удаление на рис. 1.

Слайд 30

Оценки числа операций в худшем случае 10 18 19 6 2

Оценки числа операций
в худшем случае

10

18

19

6

2

построение дерева для последовательности из n элементов


поиск элемента с заданным ключом x

добавление элемента с заданным ключом х

в худшем случае высота дерева
h = n-1

обход дерева из n вершин

удаление элемента с заданным ключом x

ФПМИ БГУ

h

h

n·h

n

h

Слайд 31

Сборник задач по теории алгоритмов : учеб.-метод. пособие / В.М. Котов,

Сборник задач по теории алгоритмов : учеб.-метод. пособие / В.М. Котов,

Ю.Л. Орлович, Е.П. Соболевская, С.А. Соболь – Минск : БГУ, 2017. С. 122-180

Литература

https://acm.bsu.by/wiki/Программная_реализация_бинарных_поисковых_деревьев

ФПМИ БГУ

0.1 построение дерева 0.2 удаление вершин из дерева 0.3 проверка является ли бинарное дерево поисковым

Общие задачи