Szukam sposobu, aby dowiedzieć się, następca w kolejności węzła w BST z wykorzystaniem dodatkowego miejsca.znajdź następcę kolejność w BST bez użycia dodatkowej przestrzeni
Odpowiedz
Aby uzyskać następcę Inorder danego węzła N
używamy następujących zasad:
- Jeśli
N
ma prawo dzieckaR
wtedyinorderSuccessor(N)
jest od lewej decedent zR
. - Else
inorderSuccessor(N)
jest najbliżej przodek,M
, zN
(jeśli istnieje) takie, żeN
pochodzi od lewej dzieckaM
. Jeśli nie ma takiego przodka, inorderSucessor nie istnieje.
Rozważmy drzewo próbki:
A
/\
B C
/\
D E
/
F
Czyje Inorder przechodzenie daje: D B F E A C
inorderSuccessor(A)
= C
jak C
jest od lewej decedent prawego dziecka A
.
inorderSuccessor(B)
= F
jako F
jest najdłuższym potomkiem właściwego dziecka B
.
inorderSuccessor(C)
= Nie istnieje.
inorderSuccessor(D)
= B
jako B
to lewe dziecko z D
.
inorderSuccessor(E)
= A
. E
nie ma prawa dziecka więc mamy scenariusz 2. Idziemy do rodzica E
który jest B
, ale E
ma rację decedent z B
, więc przechodzimy do rodzica B
która A
i B
pozostało decedent z A
tak A
jest odpowiedzią.
inorderSuccessor(F)
= E
jako F
to lewe dziecko z E
.
Procedura:
treeNodePtr inorderSucessor(treeNodePtr N) {
if(N) {
treeNodePtr tmp;
// CASE 1: right child of N exists.
if(N->right) {
tmp = N->right;
// find leftmost node.
while(tmp->left) {
tmp = tmp->left;
}
// CASE 2: No right child.
} else {
// keep climbing till you find a parent such that
// node is the left decedent of it.
while((tmp = N->parent)) {
if(tmp->left == N) {
break;
}
N = tmp;
}
}
return tmp;
}
// No IOS.
return NULL;
}
Mała korekta w twoim objaśnieniu do inerentSuccessor (D): to D jest lewym dzieckiem B. – ric0liva
Jeśli możesz uzyskać dostęp do katalogu głównego węzła, to tylko kwestia przesuwania wskaźników, więc nie ma dodatkowej przestrzeni. Zobacz this lecture.
Jeśli podany węzeł ma właściwe dziecko - przejdź do niego, a następnie wykonaj iteracyjnie lewe dzieci aż do węzła N bez lewego dziecka. Zwróć nr
W przeciwnym razie podążaj za rodzicami, dopóki nie znajdziesz rodzica, w którym węzeł jest lewym dzieckiem. Zwróć ten rodzic.
Node InOrderSuccessor(Node node) {
if (node.right() != null) {
node = node.right()
while (node.left() != null)
node = node.left()
return node
} else {
parent = node.getParent();
while (parent != null && parent.right() == node) {
node = parent
parent = node.getParent()
}
return parent
}
}
To jest złe. Co jeśli dany węzeł nie ma właściwego dziecka i jest jego prawym dzieckiem? Zwrócisz wtedy mniejszy węzeł. – IVlad
IVlad: Dzięki, chyba naprawiłem. –
node.getparent() działa tylko wtedy, gdy klasa węzła przechowuje element nadrzędny każdego węzła! – theblackpearl
Poniższa metoda pozwala określić następcę Inorder BEZ każdego rodzica węzła lub dodatkową przestrzeń NIEPODLEGANIA rekurencyjnie
struct node * inOrderSuccessor(struct node *root, struct node *n)
{
//*If the node has a right child, return the smallest value of the right sub tree*
if(n->right != NULL)
return minValue(n->right);
//*Return the first ancestor in whose left subtree, node n lies*
struct node *succ=NULL;
while(root)
{
if(n->datadata < root->data)
{
succ=root; root=root->left;
}
else if(n->data > root->data)
root=root->right;
else break;
}
return succ;
}
jestem dość to prawda. Popraw mnie, jeśli się mylę. Dzięki.
- 1. Znajdź wspólne elementy w N posortowanych tablicach bez dodatkowej przestrzeni
- 2. Tworzenie DMG bez dodatkowej przestrzeni
- 3. Jak przetestować "dodaj" w DAO bez użycia "znajdź" itp.?
- 4. HorizontalScrollView w TabHost dodanie dodatkowej przestrzeni na końcu
- 5. permutacje BST
- 6. Znajdź parzysty/nieparzysty numer bez użycia operatora matematycznego/bitowego
- 7. BST z duplikatów
- 8. SelectSingleNode bez przestrzeni nazw
- 9. Jak określić kolejność importu przestrzeni nazw w [R]
- 10. Używanie domyślnych przestrzeni nazw w .NET MVC dla widoków bez użycia importu?
- 11. Zaleta drzew B + nad BST?
- 12. Implementowanie stosu przy użyciu BST
- 13. WPF groupbox bez przestrzeni nagłówka
- 14. Znajdź rekord w dbSet użycie funkcji Znajdź bez klucza podstawowego
- 15. Znajdź odpowiednie parametry zdarzenia bez użycia trybu projektowania w Visual Studio 2010
- 16. Wstawianie instrukcji użycia w przestrzeni nazw kończy się niepowodzeniem.
- 17. Uruchamianie PHP bez rozszerzenia bez użycia mod_rewrite?
- 18. Definiowanie nazw Wiosna JAXB bez użycia NamespacePrefixMapper
- 19. globalne stałe bez użycia #define
- 20. td układanie bez użycia css
- 21. Jak mogę utworzyć system plików przestrzeni użytkownika za pomocą FUSE bez użycia libfuse?
- 22. Zapis zapytań bez użycia pętli
- 23. Obracanie kursora bez użycia WinForms
- 24. Podprocesowe stdin bez użycia plików
- 25. Jak znaleźć pierwszego znaku ciągu znaków bez użycia metody API
- 26. Znajdź katalogów bez plików w Unix/Linux
- 27. Pokaż przecinek w CSV bez użycia przecinka
- 28. Parsowanie daty w python bez użycia domyślnego
- 29. Rysowanie sferyczne w OpenGL bez użycia gluSphere()?
- 30. Iterowanie bez użycia kursora w MYSQL
Jakie informacje są przechowywane w każdym węźle? A jaką część uważasz za trudną? Definicja "zamówienia"? Znalezienie następcy? A może masz metodę, ale twoja metoda wykorzystuje dodatkową przestrzeń? –
Istotne: http://stackoverflow.com/questions/3764799/applying-a-logarithm-to-navigate-a-tree – Arun