Files
hello-algo/ru/codes/go/chapter_tree/array_binary_tree.go
Yudong Jin 772183705e Add ru version (#1865)
* Add Russian docs site baseline

* Add Russian localized codebase

* Polish Russian code wording

* Update ru code translation.

* Update code translation and chapter covers.

* Fix pythontutor extraction.

* Add README and landing page.

* placeholder of profiles

* Use figures of English version

* Remove chapter paperbook
2026-03-28 04:24:07 +08:00

102 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// File: array_binary_tree.go
// Created Time: 2023-07-24
// Author: Reanon (793584285@qq.com)
package chapter_tree
/* Класс двоичного дерева в массивном представлении */
type arrayBinaryTree struct {
tree []any
}
/* Конструктор */
func newArrayBinaryTree(arr []any) *arrayBinaryTree {
return &arrayBinaryTree{
tree: arr,
}
}
/* Вместимость списка */
func (abt *arrayBinaryTree) size() int {
return len(abt.tree)
}
/* Получить значение узла с индексом i */
func (abt *arrayBinaryTree) val(i int) any {
// Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
if i < 0 || i >= abt.size() {
return nil
}
return abt.tree[i]
}
/* Получить индекс левого дочернего узла узла с индексом i */
func (abt *arrayBinaryTree) left(i int) int {
return 2*i + 1
}
/* Получить индекс правого дочернего узла узла с индексом i */
func (abt *arrayBinaryTree) right(i int) int {
return 2*i + 2
}
/* Получить индекс родительского узла узла с индексом i */
func (abt *arrayBinaryTree) parent(i int) int {
return (i - 1) / 2
}
/* Обход в ширину */
func (abt *arrayBinaryTree) levelOrder() []any {
var res []any
// Непосредственно обходить массив
for i := 0; i < abt.size(); i++ {
if abt.val(i) != nil {
res = append(res, abt.val(i))
}
}
return res
}
/* Обход в глубину */
func (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {
// Если это пустая позиция, вернуть
if abt.val(i) == nil {
return
}
// Предварительный обход
if order == "pre" {
*res = append(*res, abt.val(i))
}
abt.dfs(abt.left(i), order, res)
// Симметричный обход
if order == "in" {
*res = append(*res, abt.val(i))
}
abt.dfs(abt.right(i), order, res)
// Обратный обход
if order == "post" {
*res = append(*res, abt.val(i))
}
}
/* Предварительный обход */
func (abt *arrayBinaryTree) preOrder() []any {
var res []any
abt.dfs(0, "pre", &res)
return res
}
/* Симметричный обход */
func (abt *arrayBinaryTree) inOrder() []any {
var res []any
abt.dfs(0, "in", &res)
return res
}
/* Обратный обход */
func (abt *arrayBinaryTree) postOrder() []any {
var res []any
abt.dfs(0, "post", &res)
return res
}