Table des matières
回复内容:
Maison développement back-end tutoriel php 数据结构和算法 - PHP 如何实现用户二叉树排序需求

数据结构和算法 - PHP 如何实现用户二叉树排序需求

Jun 06, 2016 pm 08:36 PM
php

用户二叉树排序需求

  1. 用户注册,输入以下注册信息:

    <code>- 电子邮箱
    - 密码
    - 确认密码
    - 推荐人ID(此ID可以在数据库中手动增加一个)
    </code>
    Copier après la connexion
    Copier après la connexion
  2. 每注册进一个新用户,该用户就进入到排序中

  3. 排序规则

    1. 新增用户必须在推荐人下面
    2. 按照从左到右,从上到下的方式遍历,找到空位插入数据

下列是图解:

假设A是根节点(A就是手动添加的第一位用户)
有一个新用户注册进来(假设新用户为B),推荐人ID填写的是A的ID,则排序如下:

<code>    A
    /
   B 
</code>
Copier après la connexion
Copier après la connexion

又有一位C用户注册,推荐人ID填写的是B的ID,则:

<code>     A
    /
   B
  /
 C
</code>
Copier après la connexion
Copier après la connexion

有一位D用户注册,推荐人ID填写的是A的ID,则:

<code>   A
  /  \
 B   D  
/
</code>
Copier après la connexion
Copier après la connexion

C

有一位E用户注册,推荐人ID填写的是B的ID,则

<code>       A
      /  \
     B   D  
    /  \
   C   E
</code>
Copier après la connexion
Copier après la connexion

有一位F用户注册,推荐人ID填写的是A的ID,则

<code>       A
     /   \
    B     D 
   /  \   /
  C   E F
</code>
Copier après la connexion
Copier après la connexion

有一位G用户注册,推荐人ID填写的是E的ID,则

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
      /
     G
</code>
Copier après la connexion
Copier après la connexion

有一位H用户注册,推荐人ID填写的是B的ID,则

H的推荐人是B,所以,H必定是在B的下面,然后按照从左到右的方式查找,C和E占了上面的两个位置,所以到下一排查找,找到空位,则插入H,以下都是这种规律

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
 /    /
H   G
</code>
Copier après la connexion
Copier après la connexion

有一位I用户,和J用户又陆续注册进来,填写的都是C的ID,则

<code>           A
        /       \
       B       D    
     /     \   /
    C     E  F
   /   \   /
  H    I G
 /
J
</code>
Copier après la connexion
Copier après la connexion

有一位K用户,和L用户又陆续注册进来,填写的都是A的ID,则

<code>          A
     /         \
    B          D    
  /     \      /   \
 C       E   F   K
/   \    /   \
   H    I  G   L
  /
J
</code>
Copier après la connexion
Copier après la connexion

有一位M用户,N用户和O用户 又注册进来,填写的分别是B用户,C用户,和L用户的ID,则:

<code><br> A              
         /         \
        B          D    
      /    \      /    \
     C     E    F     K
    /   \  /   \
   H   I G    L
  /  \  
 J   M      
</code>
Copier après la connexion
Copier après la connexion
<code>               A                
          /          \
         B           D  
      /      \      /     \
      C       E   F      K
    /    \    /   \
   H     I  G   L
  /   \   / 
 J   M  N    
</code>
Copier après la connexion
Copier après la connexion
<code>                A               
           /           \
          B            D    
       /      \     /       \
     C        E   F       K
   /    \    /    \
  H     I  G     L
 /  \    /        /
J   M  N        O
</code>
Copier après la connexion
Copier après la connexion

有一位P用户、Q用户、R用户、S用户又注册进来,填写的分别是A用户,B用户,E用户,A用户的ID。则:

<code>                  A             
            /           \
           B            D   
         /     \       /     \
       C       E     F     K
    /     \    /   \   /
   H     I  G   L  P
  /   \   /      /
 J   M  N     O
</code>
Copier après la connexion
Copier après la connexion
<code>                   A                
            /             \
           B              D 
        /      \        /      \
       C       E      F      K
    /     \    /   \    /
   H      I  G    L  P
  /  \    /  \      /
 J   M  N   Q   O
</code>
Copier après la connexion
Copier après la connexion
<code>                         A              
                /                \
               B                  D 
           /         \          /       \
          C           E       F       K
       /     \        /   \    /
      H      I      G    L  P
     /  \    /  \    /     /
    J   M  N  Q  R    O
</code>
Copier après la connexion
Copier après la connexion
<code>                     A              
            /                 \
           B                   D    
       /         \           /       \
     C           E        F         K
   /    \       /    \    /    \
 H      I     G     L  P    S 
/  \    /  \    /     /
   J   M  N  Q  R    O
</code>
Copier après la connexion
Copier après la connexion

回复内容:

用户二叉树排序需求

  1. 用户注册,输入以下注册信息:

    <code>- 电子邮箱
    - 密码
    - 确认密码
    - 推荐人ID(此ID可以在数据库中手动增加一个)
    </code>
    Copier après la connexion
    Copier après la connexion
  2. 每注册进一个新用户,该用户就进入到排序中

  3. 排序规则

    1. 新增用户必须在推荐人下面
    2. 按照从左到右,从上到下的方式遍历,找到空位插入数据

下列是图解:

假设A是根节点(A就是手动添加的第一位用户)
有一个新用户注册进来(假设新用户为B),推荐人ID填写的是A的ID,则排序如下:

<code>    A
    /
   B 
</code>
Copier après la connexion
Copier après la connexion

又有一位C用户注册,推荐人ID填写的是B的ID,则:

<code>     A
    /
   B
  /
 C
</code>
Copier après la connexion
Copier après la connexion

有一位D用户注册,推荐人ID填写的是A的ID,则:

<code>   A
  /  \
 B   D  
/
</code>
Copier après la connexion
Copier après la connexion

C

有一位E用户注册,推荐人ID填写的是B的ID,则

<code>       A
      /  \
     B   D  
    /  \
   C   E
</code>
Copier après la connexion
Copier après la connexion

有一位F用户注册,推荐人ID填写的是A的ID,则

<code>       A
     /   \
    B     D 
   /  \   /
  C   E F
</code>
Copier après la connexion
Copier après la connexion

有一位G用户注册,推荐人ID填写的是E的ID,则

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
      /
     G
</code>
Copier après la connexion
Copier après la connexion

有一位H用户注册,推荐人ID填写的是B的ID,则

H的推荐人是B,所以,H必定是在B的下面,然后按照从左到右的方式查找,C和E占了上面的两个位置,所以到下一排查找,找到空位,则插入H,以下都是这种规律

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
 /    /
H   G
</code>
Copier après la connexion
Copier après la connexion

有一位I用户,和J用户又陆续注册进来,填写的都是C的ID,则

<code>           A
        /       \
       B       D    
     /     \   /
    C     E  F
   /   \   /
  H    I G
 /
J
</code>
Copier après la connexion
Copier après la connexion

有一位K用户,和L用户又陆续注册进来,填写的都是A的ID,则

<code>          A
     /         \
    B          D    
  /     \      /   \
 C       E   F   K
/   \    /   \
   H    I  G   L
  /
J
</code>
Copier après la connexion
Copier après la connexion

有一位M用户,N用户和O用户 又注册进来,填写的分别是B用户,C用户,和L用户的ID,则:

<code><br> A              
         /         \
        B          D    
      /    \      /    \
     C     E    F     K
    /   \  /   \
   H   I G    L
  /  \  
 J   M      
</code>
Copier après la connexion
Copier après la connexion
<code>               A                
          /          \
         B           D  
      /      \      /     \
      C       E   F      K
    /    \    /   \
   H     I  G   L
  /   \   / 
 J   M  N    
</code>
Copier après la connexion
Copier après la connexion
<code>                A               
           /           \
          B            D    
       /      \     /       \
     C        E   F       K
   /    \    /    \
  H     I  G     L
 /  \    /        /
J   M  N        O
</code>
Copier après la connexion
Copier après la connexion

有一位P用户、Q用户、R用户、S用户又注册进来,填写的分别是A用户,B用户,E用户,A用户的ID。则:

<code>                  A             
            /           \
           B            D   
         /     \       /     \
       C       E     F     K
    /     \    /   \   /
   H     I  G   L  P
  /   \   /      /
 J   M  N     O
</code>
Copier après la connexion
Copier après la connexion
<code>                   A                
            /             \
           B              D 
        /      \        /      \
       C       E      F      K
    /     \    /   \    /
   H      I  G    L  P
  /  \    /  \      /
 J   M  N   Q   O
</code>
Copier après la connexion
Copier après la connexion
<code>                         A              
                /                \
               B                  D 
           /         \          /       \
          C           E       F       K
       /     \        /   \    /
      H      I      G    L  P
     /  \    /  \    /     /
    J   M  N  Q  R    O
</code>
Copier après la connexion
Copier après la connexion
<code>                     A              
            /                 \
           B                   D    
       /         \           /       \
     C           E        F         K
   /    \       /    \    /    \
 H      I     G     L  P    S 
/  \    /  \    /     /
   J   M  N  Q  R    O
</code>
Copier après la connexion
Copier après la connexion

不谈为何要实现这样一个奇怪的需求。
就简单实现这个功能来讲,可以根据数据结构中二叉树的顺序存储方式来解决吧。

这里就用PHP中的数组来模拟二叉树的顺序存储,数组中的key相当于存储地址,value相当于存储的数据。当然key为有类似下面这样的结构:

<code>             0
           /   \
           1   2
</code>
Copier après la connexion

也就是父节点key值记为n,则左子节点key为2n+1,右子节点key为2(n+1)。下面简单用PHP代码实现下吧(由家里本本没有PHP运行环境,没测试代码的完全正确性@#@):

<code>php</code><code>class Tree {
    private $data = [];

    public function __construct() {}

    /**
     * @param mixed $val
     * @param int $pid 父节点在$data中的key值
     * @return int 返回插入节点的对应在$data中的key值
     */
    public function add($val, $pid = 0) {

        // 若为空树则插入根节点
        if (!count($this->data)) {
            $this->data[0] = $val;
            return 0;
        }

        // 若左子节点为空则插入左子节点
        if (!isset($this->data[2*$pid+1])) {
            $this->data[2*$pid+1] = $val;
            return 2*$pid+1;
        }

        // 若右子节点为空则插入右子节点
        if (!isset($this->data[2*$pid+2])) {
            $this->data[2*pid+2] = val;
            return 2*pid+2;
        }

        // 获取$data中最后一个节点的key值
        $maxKey = max(array_keys($this->data);

        // 如果是完全二叉树的情况(也就是$data中没有空节点)则在$data最后插入值
        if (count($this->data) === $maxKey + 1) {
            $this->data[$maxKey+1] = $val;
            return $maxKey + 1;
        }

        // 不为完全二叉树则在$data中最小的空key处插入值
        for ($i = 0; $i data[$i])) {
                $this->data[$i] = $val;
                return $i;
            }
        }
    }
}


// 简单测试
$tree = new Tree();
$aid = $tree->add('A', 0);
$bid = $tree->add('B', $aid);
$tree->add('C', $bid);
</code>
Copier après la connexion

你好,你这个需求会了吗?现在我也遇到这个需求,无法实现啊···求帮助,QQ369832727

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

Journalisation CakePHP Journalisation CakePHP Sep 10, 2024 pm 05:26 PM

Se connecter à CakePHP est une tâche très simple. Il vous suffit d'utiliser une seule fonction. Vous pouvez enregistrer les erreurs, les exceptions, les activités des utilisateurs, les actions entreprises par les utilisateurs, pour tout processus en arrière-plan comme cronjob. La journalisation des données dans CakePHP est facile. La fonction log() est fournie

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

Guide rapide CakePHP Guide rapide CakePHP Sep 10, 2024 pm 05:27 PM

CakePHP est un framework MVC open source. Cela facilite grandement le développement, le déploiement et la maintenance des applications. CakePHP dispose d'un certain nombre de bibliothèques pour réduire la surcharge des tâches les plus courantes.

See all articles