Jadual Kandungan
回复内容:
Rumah pembangunan bahagian belakang tutorial php 数据结构和算法 - PHP 如何实现用户二叉树排序需求

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

Jun 06, 2016 pm 08:36 PM
php

用户二叉树排序需求

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

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

  3. 排序规则

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

下列是图解:

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

<code>    A
    /
   B 
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>     A
    /
   B
  /
 C
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>   A
  /  \
 B   D  
/
</code>
Salin selepas log masuk
Salin selepas log masuk

C

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

<code>       A
      /  \
     B   D  
    /  \
   C   E
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>       A
     /   \
    B     D 
   /  \   /
  C   E F
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
      /
     G
</code>
Salin selepas log masuk
Salin selepas log masuk

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

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

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
 /    /
H   G
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>           A
        /       \
       B       D    
     /     \   /
    C     E  F
   /   \   /
  H    I G
 /
J
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>          A
     /         \
    B          D    
  /     \      /   \
 C       E   F   K
/   \    /   \
   H    I  G   L
  /
J
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code><br> A              
         /         \
        B          D    
      /    \      /    \
     C     E    F     K
    /   \  /   \
   H   I G    L
  /  \  
 J   M      
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>               A                
          /          \
         B           D  
      /      \      /     \
      C       E   F      K
    /    \    /   \
   H     I  G   L
  /   \   / 
 J   M  N    
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>                A               
           /           \
          B            D    
       /      \     /       \
     C        E   F       K
   /    \    /    \
  H     I  G     L
 /  \    /        /
J   M  N        O
</code>
Salin selepas log masuk
Salin selepas log masuk

有一位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>
Salin selepas log masuk
Salin selepas log masuk
<code>                   A                
            /             \
           B              D 
        /      \        /      \
       C       E      F      K
    /     \    /   \    /
   H      I  G    L  P
  /  \    /  \      /
 J   M  N   Q   O
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>                         A              
                /                \
               B                  D 
           /         \          /       \
          C           E       F       K
       /     \        /   \    /
      H      I      G    L  P
     /  \    /  \    /     /
    J   M  N  Q  R    O
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>                     A              
            /                 \
           B                   D    
       /         \           /       \
     C           E        F         K
   /    \       /    \    /    \
 H      I     G     L  P    S 
/  \    /  \    /     /
   J   M  N  Q  R    O
</code>
Salin selepas log masuk
Salin selepas log masuk

回复内容:

用户二叉树排序需求

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

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

  3. 排序规则

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

下列是图解:

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

<code>    A
    /
   B 
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>     A
    /
   B
  /
 C
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>   A
  /  \
 B   D  
/
</code>
Salin selepas log masuk
Salin selepas log masuk

C

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

<code>       A
      /  \
     B   D  
    /  \
   C   E
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>       A
     /   \
    B     D 
   /  \   /
  C   E F
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
      /
     G
</code>
Salin selepas log masuk
Salin selepas log masuk

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

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

<code>        A
     /     \
    B      D    
   /  \    /
  C   E  F
 /    /
H   G
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>           A
        /       \
       B       D    
     /     \   /
    C     E  F
   /   \   /
  H    I G
 /
J
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code>          A
     /         \
    B          D    
  /     \      /   \
 C       E   F   K
/   \    /   \
   H    I  G   L
  /
J
</code>
Salin selepas log masuk
Salin selepas log masuk

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

<code><br> A              
         /         \
        B          D    
      /    \      /    \
     C     E    F     K
    /   \  /   \
   H   I G    L
  /  \  
 J   M      
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>               A                
          /          \
         B           D  
      /      \      /     \
      C       E   F      K
    /    \    /   \
   H     I  G   L
  /   \   / 
 J   M  N    
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>                A               
           /           \
          B            D    
       /      \     /       \
     C        E   F       K
   /    \    /    \
  H     I  G     L
 /  \    /        /
J   M  N        O
</code>
Salin selepas log masuk
Salin selepas log masuk

有一位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>
Salin selepas log masuk
Salin selepas log masuk
<code>                   A                
            /             \
           B              D 
        /      \        /      \
       C       E      F      K
    /     \    /   \    /
   H      I  G    L  P
  /  \    /  \      /
 J   M  N   Q   O
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>                         A              
                /                \
               B                  D 
           /         \          /       \
          C           E       F       K
       /     \        /   \    /
      H      I      G    L  P
     /  \    /  \    /     /
    J   M  N  Q  R    O
</code>
Salin selepas log masuk
Salin selepas log masuk
<code>                     A              
            /                 \
           B                   D    
       /         \           /       \
     C           E        F         K
   /    \       /    \    /    \
 H      I     G     L  P    S 
/  \    /  \    /     /
   J   M  N  Q  R    O
</code>
Salin selepas log masuk
Salin selepas log masuk

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

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

<code>             0
           /   \
           1   2
</code>
Salin selepas log masuk

也就是父节点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>
Salin selepas log masuk

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

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

Log masuk CakePHP adalah tugas yang sangat mudah. Anda hanya perlu menggunakan satu fungsi. Anda boleh log ralat, pengecualian, aktiviti pengguna, tindakan yang diambil oleh pengguna, untuk sebarang proses latar belakang seperti cronjob. Mengelog data dalam CakePHP adalah mudah. Fungsi log() disediakan

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Panduan Ringkas CakePHP Panduan Ringkas CakePHP Sep 10, 2024 pm 05:27 PM

CakePHP ialah rangka kerja MVC sumber terbuka. Ia menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP mempunyai beberapa perpustakaan untuk mengurangkan beban tugas yang paling biasa.

See all articles