Сложность: easy
Задав корень дерева двоичного поиска, перестройте дерево по порядку так, чтобы самый левый узел дерева теперь был корнем дерева, а каждый узел не имел левого и только одного правого дочернего узла.
Пример:
Input: root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
Output: [1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
👨💻 Алгоритм:
1⃣Выполнить обход дерева в порядке in-order, чтобы получить список узлов.
2⃣Перестроить дерево, устанавливая каждый узел из списка как правый дочерний элемент предыдущего узла и устанавливая левые дочерние элементы в null.
3⃣Вернуть новый корень дерева (первый элемент списка).
😎 Решение:
using System;
using System.Collections.Generic;
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class Solution {
public TreeNode IncreasingBST(TreeNode root) {
List<TreeNode> nodes = new List<TreeNode>();
Inorder(root, nodes);
for (int i = 0; i < nodes.Count - 1; i++) {
nodes[i].left = null;
nodes[i].right = nodes[i + 1];
}
nodes[nodes.Count - 1].left = null;
nodes[nodes.Count - 1].right = null;
return nodes[0];
}
private void Inorder(TreeNode node, List<TreeNode> nodes) {
if (node == null) return;
Inorder(node.left, nodes);
nodes.Add(node);
Inorder(node.right, nodes);
}
}
Ставь 👍 и забирай 📚 Базу знаний