Conversion d'une liste chaînée ordonnée en un arbre de recherche binaire

1. Demande

  • Étant donné une liste liée à un seul lien, les éléments qu'elle contient sont triés par ordre croissant et convertis en un arbre de recherche binaire hautement équilibré;

  • Dans cette question, un arbre binaire hautement équilibré signifie que la valeur absolue de la différence de hauteur entre les sous-arbres gauche et droit de chaque nœud d'un arbre binaire ne dépasse pas 1;

Deuxièmement, le pointeur de vitesse

2.1 Analyse de la pensée

  1. Pour une liste chaînée ordonnée, si vous voulez trouver son élément du milieu, vous devez utiliser les pointeurs rapide et lent. Chaque fois que le pointeur rapide se déplace d'un espace de plus que le pointeur lent. Lorsque le pointeur rapide pointe sur null ou sur l'élément suivant du pointeur rapide pointe sur null, il est lent Le pointeur pointe vers l'élément du milieu;
  2. Sauf pour l'étape 1, l'idée de base est la même que "convertir un tableau ordonné en un arbre de recherche binaire";

2.2 Implémentation du code

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null) return null;
        return helper(head, null);
    }
    //符合左闭右开
    public TreeNode helper(ListNode head, ListNode tail) {
        if(head == tail) return null;
        ListNode fast = head;
        ListNode slow = head;
        while(fast != tail && fast.next != tail) {
            fast = fast.next.next;
            slow = slow.next;
        }
        TreeNode root = new TreeNode(slow.val);
        root.left = helper(head, slow);
        root.right = helper(slow.next, tail);
        return root;
    }
}

2.3 Analyse de complexité

  • La complexité temporelle est O (N), et l'établissement d'un arbre de recherche binaire nécessite la traversée de tous les nœuds de liste chaînée;
  • La complexité de l'espace est O (log_2N);

Je suppose que tu aimes

Origine blog.csdn.net/Sruggle/article/details/113445427
conseillé
Classement