chemin vers le noeud dans l'arbre de recherche binaire comme arbre de recherche binaire

ZachJH:

J'écris une implémentation de l'arbre de recherche binaire, et je veux avoir une fonction qui trouve un nœud et retourne une liste doublement chaînée de tous les nœuds du chemin qu'il a fallu pour y arriver. Je sais qu'une liste doublement chaînée peut être converti en un arbre de recherche binaire, donc ce serait vraiment sympa (et cool) pour être en mesure d'utiliser la même classe.

Cependant, si je fais des copies peu profondes de tous les nœuds le long du chemin et commencer à changer leurs pointeurs pour construire l'arbre de recherche binaire Je veux revenir, je vais évidemment en train de détruire l'arbre original. Je ne peux pas faire une copie en profondeur de tous les noeuds parce que je vais avoir besoin de références aux nœuds d'origine, que je vais utiliser pour changer l'arbre d'origine (pourrait être la suppression, équilibrage, ...).

Par exemple, je pourrais avoir une fonction d'ajouter que les appels trouvent, qui retourne le dernier nœud dans le chemin où le nouveau nœud allait, et je peux simplement le placer comme l'un des enfants là-bas. Si je vous écris un auto-équilibrage classe arbre binaire (Rouge / Arbre noir, AVL Arbre, Splay Arbre), que je peux sous-classe de celui-ci, il sera agréable d'avoir accès à au moins les parents et les grands-parents du noeud Je viens d'ajouter (que je pouvais la bonne voie avec des pointeurs supplémentaires, mais la méthode de recherche n'est pas aussi polyvalent).

Bien sûr, une solution consiste à écrire juste une autre classe. Une autre solution consisterait à régler pour une liste des liaisons simples lié, et en utilisant l'autre pointeur de renvoyer au noeud d'origine correspondant. Mais, à ce stade, il est plus que juste avoir une solution qui fonctionne. La langue que je utilise Java est, mais je serais certainement intéressé à savoir si une autre langue a une fonction pour cela, aussi bien. Il ne me semble pas très possible, mais je ne pouvais tout à fait manquer quelque chose.

Ne sait quiconque s'il y a une façon de le faire, ou avez des suggestions pour ce que je pourrais faire à la place?

Daniel Junglas:

Donc , vous voulez utiliser la classe de nœud utilisé pour l'arbre binaire pour construire une double liste liée. Je suppose que cette classe de nœud a quatre champs: leffChild, rightChild, parent, data, où datadétient les données stockées au niveau du noeud. Maintenant , vous pouvez abuser de ces champs pour créer une liste doublement chaînée, par exemple en utilisant leftChildcomme prevet rightChildcomme nextchamp du nœud dans la liste doublement chaînée. Si vous le faites , alors vous pouvez toujours utiliser les parentet les datachamps de ce nœud. Ainsi , vous pouvez créer de nouveaux nœuds pour la liste doublement chaînée mais qui ont le parentchamp de ces noeuds pointent vers le noeud respectif dans l'arbre binaire.

Cela dit, votre approche semble un peu étrange. Les noeuds dans la liste doublement chaînée auront un champ inutilisé. De plus, Java fournit java.util.LinkedList qui met en œuvre une liste doublement chaînée. Il n'y a donc pas besoin de rouler votre propre en utilisant obscurcie de nœuds d'arbres binaires.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=339198&siteId=1
conseillé
Classement