Mi è stato chiesto in un'intervista di stampare il limite dell'albero binario. Per esempio.Per stampare il limite dell'albero binario
1
/ \
2 3
/\ /\
4 5 6 7
/ \ \
8 9 10
risposta sarà: 1, 2, 4, 8, 9, 10, 7, 3
ho proposta la seguente soluzione.
Primo metodo:
ho usato variabile Booleano per risolvere il problema di cui sopra.
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);
}
la sua risposta: Hai usato Bool variabile così tante volte. Puoi risolvere questo senza usare quello.
Secondo metodo:
ho semplicemente usato l'attraversamento di alberi per risolvere questo problema.
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.
La sua risposta: Anche lui non era soddisfatto di questo metodo. Ha detto che sei attraversando l'albero 3 volte. Quello è troppo. Dare un'altra soluzione se ne avete.
Terzo Metodo: Questa volta ho andato per attraversamento livello Order (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.
la sua risposta: Non era sembra contento di questo metodo anche perché questo metodo richiede memoria aggiuntiva di ordine O (n).
La mia domanda è: Dimmi un metodo che attraversa l'albero singole volte, non utilizzare alcuna variabile Bool e non utilizzare alcuna memoria aggiuntiva. È possibile?
Penso O (1) i tempi di traslazione non è molto male! [seconda soluzione] – Emadpres
@Emadpres Non era O (1), è O (n). Perché dobbiamo attraversare tutti i nodi almeno una volta. –
'O (1)' si riferisce a '3'. attraversare 3 volte o 1 volta non importa, forse ad eccezione di usare – Emadpres