Zostałem poproszony w wywiadach, aby wydrukować granicę drzewa binarnego. Na przykład.Aby wydrukować granicę drzewa binarnego
1
/ \
2 3
/\ /\
4 5 6 7
/ \ \
8 9 10
odpowiedź będzie: 1, 2, 4, 8, 9, 10, 7, 3
daję następującą odpowiedź.
Pierwsza metoda:
Użyłem zmienną Bool rozwiązać powyższy problem.
void printLeftEdges(BinaryTree *p, bool print) {
if (!p) return;
if (print || (!p->left && !p->right))
cout << p->data << " ";
printLeftEdges(p->left, print);
printLeftEdges(p->right, false);
}
void printRightEdges(BinaryTree *p, bool print) {
if (!p) return;
printRightEdges(p->left, false);
printRightEdges(p->right, print);
if (print || (!p->left && !p->right))
cout << p->data << " ";
}
void printOuterEdges(BinaryTree *root) {
if (!root) return;
cout << root->data << " ";
printLeftEdges(root->left, true);
printRightEdges(root->right, true);
}
Jego odpowiedź: Użyłeś Bool zmiennej tak wiele razy. Czy potrafisz rozwiązać to bez użycia tego.
Druga metoda:
po prostu stosować przechodzenie drzewa, aby rozwiązać ten problem.
1. Print the left boundary in top-down manner.
2. Print all leaf nodes from left to right, which can again be sub-divided into two sub-parts:
2.1 Print all leaf nodes of left sub-tree from left to right.
2.2 Print all leaf nodes of right subtree from left to right.
3. Print the right boundary in bottom-up manner.
Jego odpowiedź: Nie był zadowolony z tej metody. Powiedział, że jesteś przemierza drzewo 3 razy. To za dużo. Daj inne rozwiązanie, jeśli je posiadasz.
Trzecia metoda: Tym razem poszliśmy do przechodzenie Level kolejności (BFS).
1: Print starting and ending node of each level
2: For each other node check if its both the children are <b>NULL</b> then print that node too.
Jego odpowiedź: Nie był zadowolony z tej metody, ponieważ ta metoda wymaga dodatkowej pamięci O (n).
Moje pytanie brzmi: Powiedz mi metodę, która przemierza drzewo jeden raz, nie używaj żadnej zmiennej Bool i nie używaj dodatkowej pamięci. Czy to możliwe?
myślę O (1) trawers czasy nie jest to, że wiele zła! [drugie rozwiązanie] – Emadpres
@Emadpres To nie był O (1), to O (n). Ponieważ musimy co najmniej raz przemieścić wszystkie węzły. –
'O (1)' odnoszą się do '3'. Przemieszczenie 3 razy lub 1 raz naprawdę nie ma znaczenia, może poza zatrudnieniem – Emadpres