数据结构和算法 - PHP 如何实现用户二叉树排序需求
用户二叉树排序需求
-
用户注册,输入以下注册信息:
<code>- 电子邮箱 - 密码 - 确认密码 - 推荐人ID(此ID可以在数据库中手动增加一个) </code>
Copier après la connexionCopier après la connexion 每注册进一个新用户,该用户就进入到排序中
-
排序规则
- 新增用户必须在推荐人下面
- 按照从左到右,从上到下的方式遍历,找到空位插入数据
下列是图解:
假设A是根节点(A就是手动添加的第一位用户)
有一个新用户注册进来(假设新用户为B),推荐人ID填写的是A的ID,则排序如下:
<code> A / B </code>
又有一位C用户注册,推荐人ID填写的是B的ID,则:
<code> A / B / C </code>
有一位D用户注册,推荐人ID填写的是A的ID,则:
<code> A / \ B D / </code>
C
有一位E用户注册,推荐人ID填写的是B的ID,则
<code> A / \ B D / \ C E </code>
有一位F用户注册,推荐人ID填写的是A的ID,则
<code> A / \ B D / \ / C E F </code>
有一位G用户注册,推荐人ID填写的是E的ID,则
<code> A / \ B D / \ / C E F / G </code>
有一位H用户注册,推荐人ID填写的是B的ID,则
H的推荐人是B,所以,H必定是在B的下面,然后按照从左到右的方式查找,C和E占了上面的两个位置,所以到下一排查找,找到空位,则插入H,以下都是这种规律
<code> A / \ B D / \ / C E F / / H G </code>
有一位I用户,和J用户又陆续注册进来,填写的都是C的ID,则
<code> A / \ B D / \ / C E F / \ / H I G / J </code>
有一位K用户,和L用户又陆续注册进来,填写的都是A的ID,则
<code> A / \ B D / \ / \ C E F K / \ / \ H I G L / J </code>
有一位M用户,N用户和O用户 又注册进来,填写的分别是B用户,C用户,和L用户的ID,则:
<code><br> A / \ B D / \ / \ C E F K / \ / \ H I G L / \ J M </code>
<code> A / \ B D / \ / \ C E F K / \ / \ H I G L / \ / J M N </code>
<code> A / \ B D / \ / \ C E F K / \ / \ H I G L / \ / / J M N O </code>
有一位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>
<code> A / \ B D / \ / \ C E F K / \ / \ / H I G L P / \ / \ / J M N Q O </code>
<code> A / \ B D / \ / \ C E F K / \ / \ / H I G L P / \ / \ / / J M N Q R O </code>
<code> A / \ B D / \ / \ C E F K / \ / \ / \ H I G L P S / \ / \ / / J M N Q R O </code>
回复内容:
用户二叉树排序需求
-
用户注册,输入以下注册信息:
<code>- 电子邮箱 - 密码 - 确认密码 - 推荐人ID(此ID可以在数据库中手动增加一个) </code>
Copier après la connexionCopier après la connexion 每注册进一个新用户,该用户就进入到排序中
-
排序规则
- 新增用户必须在推荐人下面
- 按照从左到右,从上到下的方式遍历,找到空位插入数据
下列是图解:
假设A是根节点(A就是手动添加的第一位用户)
有一个新用户注册进来(假设新用户为B),推荐人ID填写的是A的ID,则排序如下:
<code> A / B </code>
又有一位C用户注册,推荐人ID填写的是B的ID,则:
<code> A / B / C </code>
有一位D用户注册,推荐人ID填写的是A的ID,则:
<code> A / \ B D / </code>
C
有一位E用户注册,推荐人ID填写的是B的ID,则
<code> A / \ B D / \ C E </code>
有一位F用户注册,推荐人ID填写的是A的ID,则
<code> A / \ B D / \ / C E F </code>
有一位G用户注册,推荐人ID填写的是E的ID,则
<code> A / \ B D / \ / C E F / G </code>
有一位H用户注册,推荐人ID填写的是B的ID,则
H的推荐人是B,所以,H必定是在B的下面,然后按照从左到右的方式查找,C和E占了上面的两个位置,所以到下一排查找,找到空位,则插入H,以下都是这种规律
<code> A / \ B D / \ / C E F / / H G </code>
有一位I用户,和J用户又陆续注册进来,填写的都是C的ID,则
<code> A / \ B D / \ / C E F / \ / H I G / J </code>
有一位K用户,和L用户又陆续注册进来,填写的都是A的ID,则
<code> A / \ B D / \ / \ C E F K / \ / \ H I G L / J </code>
有一位M用户,N用户和O用户 又注册进来,填写的分别是B用户,C用户,和L用户的ID,则:
<code><br> A / \ B D / \ / \ C E F K / \ / \ H I G L / \ J M </code>
<code> A / \ B D / \ / \ C E F K / \ / \ H I G L / \ / J M N </code>
<code> A / \ B D / \ / \ C E F K / \ / \ H I G L / \ / / J M N O </code>
有一位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>
<code> A / \ B D / \ / \ C E F K / \ / \ / H I G L P / \ / \ / J M N Q O </code>
<code> A / \ B D / \ / \ C E F K / \ / \ / H I G L P / \ / \ / / J M N Q R O </code>
<code> A / \ B D / \ / \ C E F K / \ / \ / \ H I G L P S / \ / \ / / J M N Q R O </code>
不谈为何要实现这样一个奇怪的需求。
就简单实现这个功能来讲,可以根据数据结构中二叉树的顺序存储方式来解决吧。
这里就用PHP中的数组来模拟二叉树的顺序存储,数组中的key相当于存储地址,value相当于存储的数据。当然key为有类似下面这样的结构:
<code> 0 / \ 1 2 </code>
也就是父节点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>
你好,你这个需求会了吗?现在我也遇到这个需求,无法实现啊···求帮助,QQ369832727

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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

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

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.

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

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

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

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.
