1 00:00:07,050 --> 00:00:09,630 [Powered by Google Translate] Como você representar todos os membros de sua família em um computador? 2 00:00:10,790 --> 00:00:12,390 Nós poderíamos simplesmente usar uma lista, 3 00:00:12,390 --> 00:00:14,400 mas não há uma hierarquia clara aqui. 4 00:00:14,400 --> 00:00:17,110 >> Vamos dizer que nós estamos começando com sua bisavó, Alice. 5 00:00:17,110 --> 00:00:19,030 Ela tem dois filhos, Bob 6 00:00:19,030 --> 00:00:21,310 e seu avô, Charlie. 7 00:00:21,310 --> 00:00:23,190 Charlie tem 3 filhos, 8 00:00:23,190 --> 00:00:26,730 seu tio, Dave, sua tia, Eva, e seu pai, Fred. 9 00:00:26,730 --> 00:00:28,750 Você é filho único de Fred. 10 00:00:28,750 --> 00:00:30,950 >> Por que organizar seus familiares, desta forma 11 00:00:30,950 --> 00:00:34,010 ser melhor do que a representação da lista simples? 12 00:00:34,010 --> 00:00:36,630 Uma razão é a de que esta estrutura hierárquica, 13 00:00:36,630 --> 00:00:39,660 chamado de "árvore", contém mais informações do que uma simples lista. 14 00:00:40,540 --> 00:00:43,520 Nós sabemos que as relações familiares entre todos 15 00:00:43,520 --> 00:00:45,440 apenas através do exame da árvore. 16 00:00:45,440 --> 00:00:47,250 Além disso, ele pode acelerar 17 00:00:47,250 --> 00:00:50,010 look-up de tempo tremenda, se os dados da árvore está classificada. 18 00:00:50,010 --> 00:00:53,850 >> Não podemos tirar vantagem de que aqui, mas vamos ver um exemplo disso em breve. 19 00:00:53,850 --> 00:00:56,150 Cada pessoa é representada por um nó na árvore. 20 00:00:56,680 --> 00:00:58,370 Nós pode ter nós filho 21 00:00:58,370 --> 00:01:00,350 bem como um nó pai. 22 00:01:00,350 --> 00:01:02,390 Estes são os termos técnicos, 23 00:01:02,390 --> 00:01:05,220 mesmo quando se usa árvores para coisas além de famílias. 24 00:01:05,220 --> 00:01:07,940 Nó de Alice tem dois filhos e não dos pais, 25 00:01:07,940 --> 00:01:11,500 enquanto nó de Charlie tem 3 filhos e uma mãe. 26 00:01:11,500 --> 00:01:14,330 >> Um nó folha é aquele que não tem filhos 27 00:01:14,330 --> 00:01:16,410 na borda externa da árvore. 28 00:01:16,410 --> 00:01:18,520 O nó mais alto da árvore, o nó raiz, 29 00:01:18,520 --> 00:01:20,240 não tem pai. 30 00:01:20,240 --> 00:01:23,170 >> Uma árvore binária é um tipo específico de árvore, 31 00:01:23,170 --> 00:01:26,720 em que cada nó tem, no máximo, 2 crianças. 32 00:01:26,720 --> 00:01:30,490 Aqui é a estrutura de um nó de uma árvore binária em C. 33 00:01:31,560 --> 00:01:34,530 Cada nó tem alguns dados associados 34 00:01:34,530 --> 00:01:36,520 e dois ponteiros para outros nós. 35 00:01:36,520 --> 00:01:38,110 >> Na nossa árvore de família, 36 00:01:38,110 --> 00:01:40,900 os dados associados era o nome de cada pessoa. 37 00:01:40,900 --> 00:01:43,850 Aqui é um int, que poderia ser qualquer coisa. 38 00:01:44,510 --> 00:01:46,200 Como se vê, 39 00:01:46,200 --> 00:01:48,990 uma árvore binária não seria uma boa representação para uma família, 40 00:01:48,990 --> 00:01:51,960 já que as pessoas muitas vezes têm mais de dois filhos. 41 00:01:51,960 --> 00:01:53,510 >> Uma árvore de busca binária 42 00:01:53,510 --> 00:01:56,380 é um tipo especial de árvore binária ordenada 43 00:01:56,380 --> 00:01:58,090 que nos permite olhar para os valores rapidamente. 44 00:01:58,740 --> 00:02:00,050 Você deve ter notado 45 00:02:00,050 --> 00:02:02,010 que cada nó abaixo da raiz de uma árvore 46 00:02:02,010 --> 00:02:04,620 é a raiz de outra árvore, chamado de "sub". 47 00:02:04,960 --> 00:02:07,090 Aqui, a raiz da árvore é de 6, 48 00:02:07,090 --> 00:02:09,860 e seu filho, 2, é a raiz de uma subárvore. 49 00:02:09,860 --> 00:02:11,870 >> Em uma árvore de pesquisa binária 50 00:02:11,870 --> 00:02:15,790 todos os valores de um nó é subárvore direita 51 00:02:15,790 --> 00:02:18,690 são maiores do que o valor do nó. Aqui: 6. 52 00:02:18,690 --> 00:02:22,640 Bem, os valores na subárvore esquerda de um nó 53 00:02:24,540 --> 00:02:26,890 são menos do que o valor do nó. 54 00:02:26,890 --> 00:02:28,620 Se precisamos de lidar com valores duplicados, 55 00:02:28,620 --> 00:02:31,760 nós podemos mudar ou daqueles a uma desigualdade solto, 56 00:02:31,760 --> 00:02:34,410 significa valores idênticos podem cair ou à esquerda ou à direita, 57 00:02:34,410 --> 00:02:37,400 desde que sejam consistentes sobre ele todo. 58 00:02:37,400 --> 00:02:39,620 Esta árvore é uma árvore de busca binária 59 00:02:39,620 --> 00:02:41,540 porque segue essas regras. 60 00:02:42,320 --> 00:02:46,020 >> Isto é como ficaria se transformou todos os nós em estruturas C. 61 00:02:46,880 --> 00:02:48,410 Observe que, se uma criança está em falta, 62 00:02:48,410 --> 00:02:50,340 o ponteiro é nulo. 63 00:02:50,340 --> 00:02:53,270 Como podemos verificar, para ver se é 7 na árvore? 64 00:02:53,270 --> 00:02:55,020 Começamos na raiz. 65 00:02:55,020 --> 00:02:58,690 Sete é superior a 6, por isso, se ele está na árvore, ela deve ser para a direita. 66 00:02:59,680 --> 00:03:03,650 Em seguida, é inferior a 8, de modo que deve ser deixado. 67 00:03:03,650 --> 00:03:06,210 Aqui, nós descobrimos 7. 68 00:03:06,210 --> 00:03:08,160 Agora, vamos verificar para 5. 69 00:03:08,160 --> 00:03:11,500 Cinco é inferior a 6, por isso deve ser para a esquerda. 70 00:03:11,500 --> 00:03:13,460 Cinco é maior do que 2, 71 00:03:13,460 --> 00:03:15,010 então deve estar certo, 72 00:03:15,010 --> 00:03:18,100 e também é maior do que 4, então deve estar certo de novo. 73 00:03:18,100 --> 00:03:20,300 No entanto, não há nenhuma criança aqui. 74 00:03:20,300 --> 00:03:22,000 O ponteiro é nulo. 75 00:03:22,000 --> 00:03:24,270 Isto significa que, 5 não é na nossa árvore. 76 00:03:24,270 --> 00:03:27,250 >> Podemos procurar a árvore binária com o seguinte código: 77 00:03:28,430 --> 00:03:31,140 Em cada nó, vamos verificar para ver se temos encontrado 78 00:03:31,140 --> 00:03:33,020 o valor que estamos procurando. 79 00:03:33,020 --> 00:03:35,740 Se não encontrá-lo, vamos determinar se ele deve ser 80 00:03:35,740 --> 00:03:38,990 sobre a esquerda ou direita e verificar que subárvore. 81 00:03:38,990 --> 00:03:41,160 Este ciclo vai continuar a descer da árvore 82 00:03:41,160 --> 00:03:44,190 até que não haja nenhum nó filho de ambos a esquerda ou para a direita. 83 00:03:45,190 --> 00:03:48,600 >> Lembre-se que 5 não estava na árvore. 84 00:03:48,600 --> 00:03:50,460 Como podemos inseri-lo? 85 00:03:50,460 --> 00:03:52,370 O processo é semelhante para busca. 86 00:03:52,370 --> 00:03:54,830 Repetimos a árvore a partir de 6 de 87 00:03:54,830 --> 00:03:57,040 esquerda para a 2, 88 00:03:57,040 --> 00:03:59,140 direita a 4, 89 00:03:59,140 --> 00:04:02,500 e novamente à direita, mas 4 não tem filho deste lado. 90 00:04:02,500 --> 00:04:06,090 Esta será a nova posição para 5, 91 00:04:06,090 --> 00:04:08,500 e ele vai começar sem filhos. 92 00:04:09,020 --> 00:04:12,220 >> O quão rápido são operações em uma árvore de busca binária? 93 00:04:12,220 --> 00:04:15,410 Recordar que Bigohnotation procura fornecer um limite superior. 94 00:04:15,410 --> 00:04:17,390 No pior dos casos, 95 00:04:17,390 --> 00:04:19,480 nossa árvore poderia ser simplesmente uma lista encadeada 96 00:04:19,480 --> 00:04:22,220 o que significa que a inserção, exclusão e pesquisa 97 00:04:22,220 --> 00:04:25,380 pode levar tempo proporcional ao número de nós na árvore. 98 00:04:25,380 --> 00:04:27,380 Este é O (n). 99 00:04:27,380 --> 00:04:30,690 >> Por exemplo, o seguinte é uma árvore de pesquisa binária válido. 100 00:04:31,850 --> 00:04:34,020 No entanto, se tentar encontrar 9, 101 00:04:34,020 --> 00:04:36,760 temos que atravessam cada nó. 102 00:04:36,760 --> 00:04:39,120 Ele não é melhor que uma lista ligada. 103 00:04:39,120 --> 00:04:41,410 Idealmente, gostaríamos cada nó 104 00:04:41,410 --> 00:04:44,120 da nossa árvore de busca binária de ter 2 filhos. 105 00:04:44,120 --> 00:04:46,370 Desta forma, a inserção, exclusão e pesquisa 106 00:04:46,370 --> 00:04:50,190 levaria, na pior das hipóteses, O (log n). 107 00:04:50,190 --> 00:04:52,470 A árvore de antes poderia ser mais equilibrado, 108 00:04:52,470 --> 00:04:54,140 como este. 109 00:04:54,140 --> 00:04:57,980 Agora, olhando-se qualquer valor tem, no máximo, 3 passos. 110 00:04:57,980 --> 00:04:59,460 Esta árvore é equilibrada, 111 00:04:59,460 --> 00:05:01,190 o que significa que é, tem uma profundidade mínima 112 00:05:01,190 --> 00:05:03,680 em relação ao número de nós. 113 00:05:03,680 --> 00:05:06,300 >> À procura de um valor em uma árvore balanceada de busca binária 114 00:05:06,300 --> 00:05:09,540 é semelhante ao de busca binária em um array ordenado. 115 00:05:09,540 --> 00:05:12,290 Na verdade, se nós não precisamos inserir ou excluir itens, 116 00:05:12,290 --> 00:05:15,150 eles se comportam exatamente da mesma maneira. 117 00:05:15,150 --> 00:05:17,600 No entanto, a estrutura da árvore é melhor 118 00:05:17,600 --> 00:05:19,530 para inserções e deleções de manipulação 119 00:05:20,360 --> 00:05:22,670 >> Meu nome é Bannus Van der Kloot. 120 00:05:22,670 --> 00:05:24,030 Este é CS50.