Учитывая двоичное дерево и два уровня уровня «низкий» и «высокий», печатать узлы от низкого уровня до высокого уровня.
For example consider the binary tree given in below diagram.
Input: Root of below tree, low = 2, high = 4
Output:
8 22
4 12
10 14
Простой метод — сначала написать рекурсивную функцию, которая печатает узлы с заданным номером уровня. Затем вызовите рекурсивную функцию в цикле от низкого до высокого. Временная сложность этого метода составляет O (n 2 ) Мы можем напечатать узлы за O (n) времени, используя итеративный обход порядка на основе очередей. Идея состоит в том, чтобы сделать простой обход порядка порядка на основе очереди. Выполняя обход Inorder, добавьте маркерный узел в конце. Всякий раз, когда мы видим узел маркера, мы увеличиваем номер уровня. Если номер уровня находится между низким и высоким, то выведите узлы.
Ниже приведена реализация вышеприведенной идеи.
C ++
// Программа на C ++ для печати уровня узлов по уровням между заданными двумя уровнями. #include <iostream> #include <queue>
usingnamespacestd;
/ * Узел двоичного дерева имеет ключ, указатель на левого и правого потомков * /
structNode
{
intkey;
structNode* left, *right;
};
/ * Учитывая двоичное дерево, печатать узлы от номера уровня 'низкий' до уровня
число "высокий" * /
voidprintLevels(Node* root, intlow, inthigh)
{
queue <Node *> Q;
Node *marker = newNode; // Узел маркера для обозначения конца уровня
intlevel = 1; // Инициализируем номер уровня
// ставим в очередь единственный узел первого уровня и узел маркера для конца уровня
Q.push(root);
Q.push(marker);
// Простой цикл прохождения порядка уровней
while(Q.empty() == false)
{
// Удалить передний элемент из очереди
Node *n = Q.front();
Q.pop();
// Проверяем, достигнут ли конец уровня
if(n == marker)
{
// выводим новую строку и номер уровня приращения
cout << endl;
level++;
// Проверка, был ли маркерный узел последним в очереди или
// номер уровня выходит за заданный верхний предел
if(Q.empty() == true|| level > high) break;
// ставим маркер в конец следующего уровня
Q.push(marker);
// Если это маркер, то нам не нужно его печатать
// и ставим в очередь своих детей
continue;
}
// Если уровень равен или больше заданного нижнего уровня,
// распечатать
if(level >= low)
cout << n->key << " ";
// ставим в очередь потомки немаркерного узла
if(n->left != NULL) Q.push(n->left);
if(n->right != NULL) Q.push(n->right);
}
}
/ * Вспомогательная функция, которая выделяет новый узел с
данный ключ и NULL левый и правый указатели. * /
Node* newNode(intkey)
{
Node* temp = newNode;
temp->key = key;
temp->left = temp->right = NULL;
return(temp);
}
/ * Программа драйвера для проверки вышеуказанных функций * /
intmain()
{
// Давайте построим BST, показанный на рисунке выше
structNode *root = newNode(20);
root->left = newNode(8);
root->right = newNode(22);
root->left->left = newNode(4);
root->left->right = newNode(12);
root->left->right->left = newNode(10);
root->left->right->right = newNode(14);
cout << "Level Order traversal between given two levels is";
printLevels(root, 2, 3);
return0;
}
Джава
// Java-программа для печати узлов по уровням между заданными двумя уровнями
importjava.util.LinkedList;
importjava.util.Queue;
/ * Узел двоичного дерева имеет ключ, указатель на левого и правого потомков * /
classNode
{
intdata;
Node left, right;
publicNode(intitem)
{
data = item;
left = right = null;
}
}
classBinaryTree
{
Node root;
/ * Учитывая двоичное дерево, печатать узлы от номера уровня 'низкий' до уровня
число "высокий" * /
voidprintLevels(Node node, intlow, inthigh)
{
Queue<Node> Q = newLinkedList<>();
Node marker = newNode(4); // Узел маркера для обозначения конца уровня
intlevel = 1; // Инициализируем номер уровня
// ставим в очередь единственный узел первого уровня и узел маркера для конца уровня
Q.add(node);
Q.add(marker);
// Простой цикл прохождения порядка уровней
while(Q.isEmpty() == false)
{
// Удалить передний элемент из очереди
Node n = Q.peek();
Q.remove();
// Проверяем, достигнут ли конец уровня
if(n == marker)
{
// выводим новую строку и номер уровня приращения
System.out.println("");
level++;
// Проверка, был ли маркерный узел последним в очереди или
// номер уровня выходит за заданный верхний предел
if(Q.isEmpty() == true|| level > high)
break;
// ставим маркер в конец следующего уровня
Q.add(marker);
// Если это маркер, то нам не нужно его печатать
// и ставим в очередь своих детей
continue;
}
// Если уровень равен или больше заданного нижнего уровня,
// распечатать
if(level >= low)
System.out.print( n.data + " ");
// ставим в очередь потомки немаркерного узла
if(n.left != null)
Q.add(n.left);
if(n.right != null)
Q.add(n.right);
}
}
// Программа драйвера для проверки вышеуказанных функций
publicstaticvoidmain(String args[])
{
BinaryTree tree = newBinaryTree();
tree.root = newNode(20);
tree.root.left = newNode(8);
tree.root.right = newNode(22);
tree.root.left.left = newNode(4);
tree.root.left.right = newNode(12);
tree.root.left.right.left = newNode(10);
tree.root.left.right.right = newNode(14);
System.out.print("Level Order traversal between given two levels is ");
tree.printLevels(tree.root, 2, 3);
}
}
// Этот код предоставлен Mayank Jaiswal
питон
# Программа Python для печати узлов по уровням между # дано два уровня
# Узел двоичного дерева
classNode:
# Конструктор для создания нового узла
def__init__(self, key):
self.key =key
self.left =None
self.right =None
# Учитывая двоичное дерево, узлы печати формируют номер уровня 'low' # до уровня номер «высокий»
defprintLevels(root, low, high):
Q =[]
marker =Node(11114) # Маркерный узел для обозначения конца уровня
level =1# Инициализировать номер уровня
# Поставить в очередь единственный узел первого уровня и узел маркера для
# конец уровня
Q.append(root)
Q.append(marker)
#print Q
# Простой цикл прохождения порядка уровней
while(len(Q) >0):
# Удалить передний элемент из очереди
n =Q[0]
Q.pop(0)
#print Q
# Проверьте, достигнут ли конец уровня
ifn ==marker:
# печатать новую строку и номер уровня приращения
print
level +=1
# Проверить, был ли маркерный узел последним в очереди
# или уровень нумера находится за заданным верхним пределом
iflen(Q) ==0orlevel > high:
break
# Поставить маркер в конец следующего уровня
Q.append(marker)
# Если это маркер, то нам не нужно его печатать
# и ставить своих детей
continue
iflevel >=low:
printn.key,
# Ставить в очередь потомки немаркерного узла
ifn.left isnotNone:
Q.append(n.left)
Q.append(n.right)
# Драйвер программы для проверки вышеуказанной функции
root =Node(20)
root.left =Node(8)
root.right =Node(22)
root.left.left =Node(4)
root.left.right =Node(12)
root.left.right.left =Node(10)
root.left.right.right =Node(14)
print"Level Order Traversal between given two levels is",
printLevels(root,2,3)
# Этот код предоставлен Nikhil Kumar Singh (nickzuck_007)
C #
usingSystem;
usingSystem.Collections.Generic;
// c # программа для печати уровня узлов по уровням между заданными двумя уровнями
/ * Узел двоичного дерева имеет ключ, указатель на левого и правого потомков * /
publicclassNode
{
publicintdata;
publicNode left, right;
publicNode(intitem)
{
data = item;
left = right = null;
}
}
publicclassBinaryTree
{
publicNode root;
/ * Учитывая двоичное дерево, печатать узлы от номера уровня 'низкий' до уровня
Node marker = newNode(4); // Узел маркера для обозначения конца уровня
intlevel = 1; // Инициализируем номер уровня
// ставим в очередь единственный узел первого уровня и узел маркера для конца уровня
Q.AddLast(node);
Q.AddLast(marker);
// Простой цикл прохождения порядка уровней
while(Q.Count > 0)
{
// Удалить передний элемент из очереди
Node n = Q.First.Value;
Q.RemoveFirst();
// Проверяем, достигнут ли конец уровня
if(n == marker)
{
// выводим новую строку и номер уровня приращения
Console.WriteLine("");
level++;
// Проверка, был ли маркерный узел последним в очереди или
// номер уровня выходит за заданный верхний предел
if(Q.Count == 0 || level > high)
{
break;
}
// ставим маркер в конец следующего уровня
Q.AddLast(marker);
// Если это маркер, то нам не нужно его печатать
// и ставим в очередь своих детей
continue;
}
// Если уровень равен или больше заданного нижнего уровня,
// распечатать
if(level >= low)
{
Console.Write(n.data + " ");
}
// ставим в очередь потомки немаркерного узла
if(n.left != null)
{
Q.AddLast(n.left);
}
if(n.right != null)
{
Q.AddLast(n.right);
}
}
}
// Программа драйвера для проверки вышеуказанных функций
publicstaticvoidMain(string[] args)
{
BinaryTree tree = newBinaryTree();
tree.root = newNode(20);
tree.root.left = newNode(8);
tree.root.right = newNode(22);
tree.root.left.left = newNode(4);
tree.root.left.right = newNode(12);
tree.root.left.right.left = newNode(10);
tree.root.left.right.right = newNode(14);
Console.Write("Level Order traversal between given two levels is ");
tree.printLevels(tree.root, 2, 3);
}
}
// Этот код предоставлен Shrikant13
Выход
Level Order traversal between given two levels is
8 22
4 12
Временная сложность описанного выше метода равна O (n), так как он выполняет простой обход порядка уровней.
Эта статья предоставлена Фрэнком . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме