Инвертировать двоичное дерево в PHP

ребята, у меня эта проблема в PHP. Я пытаюсь инвертировать двоичное дерево в PHP, но я не знаю, как решить эту проблему.

Задача состоит в том, чтобы инвертировать двоичное дерево, чтобы порядок листьев был инвертирован.

Пример:

    1
   / \
  2   3
 / \ / \
4  5 6  7

инвертирует в:

    1
   / \
  3   2
 / \ / \
7  6 5  4

Примечание: имейте в виду, что дерево также может быть разбалансировано.

/**
 * leaf data structure
 */
class BinaryNode {

    /** @var mixed null */
    public $value = null;
    /** @var BinaryNode null */
    public $left = null;
    /** @var BinaryNode null */
    public $right = null;

    /**
     * @param mixed $value
     */
    public function __construct( $value ) {
        $this->value = $value;
    }
}

class BinaryTree
{
    /**
     * @param BinaryNode $root
     * @return BinaryNode
     */
    public static function invert($root): BinaryNode
    {
        //$BinaryNode = new BinaryNode();

        if (!isset($root)) return $root;

        $tempLeftNode = $root->left;

        $root->left = $root->right;
        $root->right = $tempLeftNode;

        self::invert($root->left);
        self::invert($root->right);

        return  $root;

    }
}

$root = new BinaryNode(1);

$root->left = new BinaryNode(2);
$root->right = new BinaryNode(3);

$root->left->left = new BinaryNode(4);
$root->left->right = new BinaryNode(5);

$root->right->left = new BinaryNode(6);
$root->right->right = new BinaryNode(7);

print_r(BinaryTree::invert($root));

В вашем классе BinaryTree есть метод инвертирования. Это не работает должным образом? Что оно делает?

Don't Panic 22.08.2018 21:49

Добро пожаловать в SO и хороший вопрос. Просто обратите внимание, что ваша функция invert возвращает null на листьях, но это запрещено вашим типом возврата, поэтому подумайте о том, чтобы исправить это для компиляции - если вы удалите спецификатор типа возврата, ваш код выдаст желаемый результат.

ggorlen 22.08.2018 21:52

Добро пожаловать в SO и проверьте ответ. Взаимодействуйте со своим вопросом. :)

Rafael 23.08.2018 15:10

Спасибо, ребята, я удалил обратный вызов, и теперь он отлично работает

Osmair Coelho 23.08.2018 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
4
1 328
2

Ответы 2

Вы можете сделать это с помощью рекурсивной функции ... Я помню, как делал подобное упражнение много лет назад ... Что ж, мое решение было бы примерно таким:

$array = [
    'a' => [
        'b1' => [
            'c1' => [
                'e1' => 4,
                'f1' => 5,
                'g1' => 6,
            ],
            'd1' => [
                'e11' => 4,
                'f11' => 5,
                'g11' => 6,
            ]
        ],
        'b2' => [
            'c2' => [
                'e2' => 4,
                'f2' => 5,
                'g2' => 6,
            ],
            'd2' => [
                'e21' => 4,
                'f21' => 5,
                'g21' => 6,
            ]
        ],
    ]
];

С функцией:

function reverse_recursively($arrayInput) {
    foreach ($arrayInput as $key => $input) {
        if (is_array($input)) {
            $arrayInput[$key] = reverse_recursively($input);
        }
    }

    return array_reverse($arrayInput);
}

echo '<pre>';
print_r($array);
echo '<br>';
print_r(reverse_recursively($array));

И вы можете увидеть тест здесь: https://3v4l.org/2pYhR

Спасибо, Рафаэль, что поделился, я решил эту проблему, ценю ваше время

Osmair Coelho 23.08.2018 16:10

Если вы использовали этот ответ, проголосуйте за и отметьте вопрос как ответ. :)

Rafael 23.08.2018 16:17
function invertTree($root) {

    if ($root == null)
        return null;
    $flag = $root->right;
    $root->right = invertTree($root->left);
    $root->left = invertTree($flag);
    return $root;
}

Другие вопросы по теме