Seconde max dans BST
C'est une question d'entrevue. Trouver le second max par TBS.
Max élément est le plus à droite de la feuille dans le BST. La seconde max est son parent ou à gauche de son enfant. Donc la solution est de traverser le BST à trouver la plus à droite de la feuille et de vérifier son parent et à gauche de l'enfant.
T-il un sens?
The max element is the rightmost leaf in the BST.
Non, avec un "régulier" BST avoir une clé dans chaque nœud, il est "le nœud le plus à droite", mais pas une feuille: pensez à un arbre contenant la racine et une feuille gauche de l'enfant (le plus à droite, sans doute). (Il y a des "feuilles arbres de recherche", où toutes les valeurs valides sont les feuilles (pensez clés de chaîne et les nœuds tout simplement la réalisation de préfixes permettant de décider de gauche ou de droite).)
Vous devez vous connecter pour publier un commentaire.
Rappelez-vous que vous pouvez lister les nœuds d'un BST dans l'ordre inverse en faisant une modification de afinde traversée qui vous propose d'explorer le sous-arbre droit en premier. Cela conduit à un algorithme simple:
Il serait de retour la valeur null si l'arbre a un seul élément.
findRightmostNode(root)
à l'extérieur de l'instruction if. Essentiellement, vous devez trouver le plus à droite de l'élément du sous-arbre gauche, ou de la mère, de la la plus à droite de l'élément. Essentiellement: 1. Trouver plus à droite de l'élément de la racine. 2. Si cet élément ne possède pas de sous-arbre gauche, retour des parents. Si il a un sous-arbre gauche, revenir le plus à droite de l'élément de sous-arbre gauche.findRightmostNode()
à accepter (&return)null
) - si vous avez fait, la différence de user2268025 10 mois de moins, "sans commentaire" réponse est ouvert de codagefindRightmostNode()
.return rightmost.left != null ? findRightmostNode(rightmost.left) : rightmost.parent
.)Non, c'est faux. Considérez ceci BST:
Ici, le second-à-max est la valeur la plus à droite de l'enfant de la gauche de l'enfant de la valeur max. Votre algorithme devra être mis à jour afin que vous vérifiez le parent de la valeur max, ou la plus à droite subchild de la gauche de l'enfant de la max.
Notez également que le max n'est pas forcément la plus à droite feuille nœud, c'est le nœud au bas de la tranche droite de l'arbre. Ci-dessus, 137 n'est pas une feuille.
Espérons que cette aide!
99 (root) / 42 (left child of 99) \ 137 (right child of 42)
N'est-ce pas un BST? Dans ce cas, le max n'est pas le nœud au bas de la tranche droite de l'arbre.L'algo peut être comme suit
'en cours', garde la trace du plus grand nombre qui est plus petit que le nombre trouvé dans l'étape 1.
Beaucoup plus facile d'approche itérative, avec le Temps, la complexité O(logN) et de l'Espace de la complexité O(1)
Une traversée variante:
Une manière très intuitive pour penser à cela est de considérer les deux cas suivants.
Supposons que le deuxième plus grand Nœud de S, et le plus grand nœud L.
i) S est inséré à la BST "plus tôt" que L.
ii) S est inséré à la BST "plus tard" que L.
Pour le premier cas, il est évident que L est le droit de l'enfant de S. C'est parce que tout nœud à l'exception de L est plus petit que S, donc ne seront pas mis sur le côté droit de S. par conséquent, lorsque L est en cours de mise, il aura le droit de l'enfant de S.
Pour le second cas, par le moment où S est inséré, L sera le plus à droite du nœud dans la BST. De toute évidence, L n'y aurait pas un droit de l'enfant parce qu'il est le plus grand. Cependant, L pourrait avoir ses propres sous-arbre gauche. Lorsque S est inséré, S à suivre pour le "droit chemin" jusqu'à ce qu'il répond à L et puis tourner à gauche pour aller à gauche de la sous-arborescence de L. Ici, nous savons que tous les nœuds dans L gauche du sous-arbre sont plus petits que S, donc S sera le plus à droite nœud du sous-arbre.
Je le ferais en aller si l'arbre du plus grand au plus petit élément et en le retournant la valeur lorsque l'on a demandé la position est atteinte. J'ai mis en place une tâche similaire pour la deuxième valeur la plus élevée.
Javascript Simple de mise en œuvre.
Vous êtes proche de la bonne réponse.
Voici ma tentative de réponse intuitive.
Le plus grand nœud est le nœud le plus à droite.
Tout ce qui est sous le nœud le plus à droite est à gauche du sous-arbre est plus grand que tous les éléments sauf le droit de la plupart nœud. Par conséquent, le plus grand nœud dans ce sous-arbre est la réponse.
Si il n'y a pas de gauche du sous-arbre puis le parent du nœud le plus à droite est celui qui est plus grand que tous les autres nœuds, sauf le droit de la plupart nœud.
Cet algorithme fait un run sur l'arbre et retourne le plus grand élément à
Item1
et le deuxième plus grand auItem2
.Le tri des appels sont O(1) parce qu'ils sont indépendants de la taille de l'arbre.
De sorte que le total temps de la complexité est O(N) et espace complexité est O(log(N)) lorsque l'arbre est équilibré.
L'idée est d'aller tout le chemin vers la droite jusqu'à ce qu'il n'y a rien sur la droite. Si il y a une gauche, et ensuite aller tout le chemin vers la droite. Si vous avez pris un à gauche, la réponse est le dernier nœud rencontré. Sinon, la réponse est l'avant-dernier nœud que vous avez rencontrés.
Voici une solution récursive en Java:
Le temps de la complexité est O(lg n).