好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php排序遍历树 php实现排序算法

很多站长朋友们都不太清楚php排序遍历树,今天小编就来给大家整理php排序遍历树,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 请教高手:php实现n叉树遍历 2、 请高手发一下PHP版本二叉树按层遍历 3、 PHP版本二叉树按层 从上到下左到右完全二叉树 4、 php 如何做排列组合 5、 PHP快速排序算法实现的原理及代码详解 请教高手:php实现n叉树遍历

要构建的无限分类的模型. 电子产品是最大的分类.家用电器 ,数码产品是其子分类.可以看到子分类是被父分类包含起来的.每个分类都有左右 两个节点编号分别是1、2、3.....

根据上面的图mysql中建立表和插入数据

CREATE TABLE  `product_categories` (

`id` MEDIUMINT( 8 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`name` VARCHAR( 20 ) NOT NULL ,

`left_node` MEDIUMINT( 8 ) NOT NULL ,

`right_node` MEDIUMINT( 8 ) NOT NULL

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO `product_categories` (`id`, `name`, `left_node`, `right_node`) VALUES(1, '电子产品', 1, 20),

(2, '家用电器', 2, 9),

(3, '电视机', 3, 4),

(4, '电冰箱', 5, 6),

(5, '空调', 7, 8),

(6, '数码产品', 10, 19),

(7, '电脑', 11, 18),

(8, '台式电脑', 12, 13),

(9, '笔记本电脑', 14, 15),

(10, '平板电脑', 16, 17);

表结构如下:

下面是PHP的实例代码:

1、获取所有节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name FROM product_categories as c, product_categories as pWHERE c.left_node BETWEEN p.left_node AND p.right_nodeAND p.name='电子产品' ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

电子产品

家用电器

电视机

电冰箱

空调

数码产品

电脑

台式电脑

笔记本电脑

平板电脑

2、 获取某个父节点以及其所有子节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name FROM product_categories as c, product_categories as pWHERE c.left_node BETWEEN p.left_node AND p.right_nodeAND p.name='数码产品' ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

数码产品

电脑

台式电脑

笔记本电脑

平板电脑

3、获取所有的叶子节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT name FROM product_categories where right_node-left_node=1");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

电视机

电冰箱

空调

台式电脑

笔记本电脑

平板电脑

4、获取某个子节点及其所有父节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT p.name FROM product_categories AS c, product_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node AND c.name = '平板电脑' ORDER BY p.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

电子产品

数码产品

电脑

平板电脑

5、获取所有节点极其所处的层级

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name, (COUNT(p.name) - 1) AS level FROM product_categories AS c, product_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node GROUP BY c.name ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

var_dump($rs);

echo '<br />';

foreach($rs as $v){

echo $v['name'].' level:'.$v['level'].'<br />';}

输出:

电子产品 level:0

家用电器 level:1

电视机 level:2

电冰箱 level:2

空调 level:2

数码产品 level:2

电脑 level:2

台式电脑 level:3

笔记本电脑 level:3

平板电脑 level:3

6、获取某个节点的层级

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name, (COUNT(p.name) - 1) AS level FROM product_categories AS c, product_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node and c.name='平板电脑' GROUP BY c.name ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

var_dump($rs);

echo '<br />';

foreach($rs as $v){

echo $v['name'].' level:'.$v['level'].'<br />';}

输出:

平板电脑 level:3

7、在某个节点后平行的插入一个节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

function addNode($left_node,$new_node){

global $pdo;

$stmt = $pdo->prepare("SELECT right_node FROM product_categories WHERE name = '$left_node'");$stmt->execute();

$rs=$stmt->fetch(PDO::FETCH_ASSOC);

$right_node=$rs['right_node'];

$pdo->exec("UPDATE product_categories SET right_node = right_node + 2 WHERE right_node > $right_node");$pdo->exec("UPDATE product_categories SET left_node = left_node + 2 WHERE left_node > $right_node");$pdo->exec("INSERT INTO product_categories(name, left_node, right_node) VALUES('$new_node', $right_node + 1, $right_node + 2)");}

addNode('家用电器','办公用品');

完成之后表结构如下:

8、删除某个节点及其所有子节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

function deleteNode($node_name){

global $pdo;

$stmt = $pdo->prepare("SELECT left_node,right_node, right_node - left_node + 1 as width FROM product_categories WHERE name ='$node_name'");$stmt->execute();

$rs=$stmt->fetch(PDO::FETCH_ASSOC);

$left_node=$rs['left_node'];

$right_node=$rs['right_node'];

$width=$rs['width'];

$pdo->exec("DELETE FROM product_categories WHERE left_node BETWEEN $left_node AND $right_node");$pdo->exec("UPDATE product_categories SET right_node = right_node - $width WHERE right_node > $right_node");$pdo->exec("UPDATE product_categories SET left_node = left_node - $width WHERE left_node > $right_node");}

deleteNode('数码产品');

完成之后表结构如下:

可以看到用多叉树的方式构建无限分类,查询的时候是非常简便的.但是在插入新的节点和删除节点时就比较麻烦了.

请高手发一下PHP版本二叉树按层遍历

#二叉树的非递归遍历

3 class Node {

4 public $data;

5 public $left;

6 public $right;

7 }

8

9 #前序遍历,和深度遍历一样

10 function preorder($root) {

11 $stack = array();

12 array_push($stack, $root);

13 while (!empty($stack)) {

14 $cnode = array_pop($stack);

15 echo $cnode->data . " ";

16 if ($cnode->right != null) array_push($stack, $cnode->right);

17 if ($cnode->left != null) array_push($stack, $cnode->left);

18 }

19 }

PHP版本二叉树按层 从上到下左到右完全二叉树

<?php

/**  * 二叉树的定义  */

class BinaryTree {

protected $key = NULL;      //  当前节点的值

protected $left = NULL;     //  左子树

protected $right = NULL;    //  右子树

/**      * 以指定的值构造二叉树,并指定左右子树      *

* @param mixed $key 节点的值.

* @param mixed $left 左子树节点.

* @param mixed $right 右子树节点.

*/

public function __construct( $key = NULL, $left = NULL, $right = NULL) {

       $this->key = $key;

        if ($key === NULL) {

            $this->left = NULL;

            $this->right = NULL;

        }

        elseif ($left === NULL) {

            $this->left = new BinaryTree();

            $this->right = new BinaryTree();

        }

        else {

            $this->left = $left;

            $this->right = $right;

        }

    }

 

    /**

     * 析构方法.

     */

    public function __destruct() {

        $this->key = NULL;

        $this->left = NULL;

        $this->right = NULL;

    }

 

    /**

    * 清空二叉树.

    **/

    public function purge () {

        $this->key = NULL;

        $this->left = NULL;

        $this->right = NULL;

    }

 

    /**

     * 测试当前节点是否是叶节点.

     *

     * @return boolean 如果节点非空并且有两个空的子树时为真,否则为假.

     */

    public function isLeaf() {

        return !$this->isEmpty() 

            $this->left->isEmpty() 

            $this->right->isEmpty();

    }

 

    /**

     * 测试节点是否为空

     *

     * @return boolean 如果节点为空返回真,否则为假.

     */

    public function isEmpty() {

        return $this->key === NULL;

    }

 

    /**

     * Key getter.

     *

     * @return mixed 节点的值.

     */

    public function getKey() {

        if ($this->isEmpty()) {

            return false;

        }

        return $this->key;

    }

 

    /**

     * 给节点指定Key值,节点必须为空

     *

     * @param mixed $object 添加的Key值.

     */

    public function attachKey($obj) {

        if (!$this->isEmpty())

            return false;

        $this->key = $obj;

        $this->left = new BinaryTree();

        $this->right = new BinaryTree();

    }

 

    /**

     * 删除key值,使得节点为空.

     */

    public function detachKey() {

        if (!$this->isLeaf())

            return false;

        $result = $this->key;

        $this->key = NULL;

        $this->left = NULL;

        $this->right = NULL;

        return $result;

    }

 

    /**

     * 返回左子树

     *

     * @return object BinaryTree 当前节点的左子树.

     */

    public function getLeft() {

        if ($this->isEmpty())

            return false;

        return $this->left;

    }

 

    /**

     * 给当前结点添加左子树

     *

     * @param object BinaryTree $t 给当前节点添加的子树.

     */

    public function attachLeft(BinaryTree $t) {

        if ($this->isEmpty() || !$this->left->isEmpty())

            return false;

        $this->left = $t;

    }

 

    /**

     * 删除左子树

     *

     * @return object BinaryTree  返回删除的左子树.

     */

    public function detachLeft() {

        if ($this->isEmpty())

            return false;

        $result = $this->left;

        $this->left = new BinaryTree();

        return $result;

    }

 

    /**

     * 返回当前节点的右子树

     *

     * @return object BinaryTree 当前节点的右子树.

     */

    public function getRight() {

        if ($this->isEmpty())

            return false;

        return $this->right;

    }

 

    /**

     * 给当前节点添加右子树

     *

     * @param object BinaryTree $t 需要添加的右子树.

     */

    public function attachRight(BinaryTree $t) {

        if ($this->isEmpty() || !$this->right->isEmpty())

            return false;

        $this->right = $t;

    }

 

    /**

     * 删除右子树,并返回此右子树

     * @return object BinaryTree 删除的右子树.

     */

    public function detachRight() {

        if ($this->isEmpty ())

            return false;

        $result = $this->right;

        $this->right = new BinaryTree();

        return $result;

    }

 

    /**

     * 先序遍历

     */

    public function preorderTraversal() {

        if ($this->isEmpty()) {

            return ;

        }

        echo ' ', $this->getKey();

        $this->getLeft()->preorderTraversal();

        $this->getRight()->preorderTraversal();

    }

 

    /**

     * 中序遍历

     */

    public function inorderTraversal() {

        if ($this->isEmpty()) {

            return ;

        }

        $this->getLeft()->preorderTraversal();

        echo ' ', $this->getKey();

        $this->getRight()->preorderTraversal();

    }

 

    /**

     * 后序遍历

     */

    public function postorderTraversal() {

        if ($this->isEmpty()) {

            return ;

        }

        $this->getLeft()->preorderTraversal();

        $this->getRight()->preorderTraversal();

        echo ' ', $this->getKey();

    }

}

 

/**

 * 二叉排序树的PHP实现

 */

 

class BST extends BinaryTree {

  /**

     * 构造空的二叉排序树

     */

    public function __construct() {

        parent::__construct(NULL, NULL, NULL);

    }

 

    /**

     * 析构

     */

    public function __destruct() {

        parent::__destruct();

    }

 

    /**

     * 测试二叉排序树中是否包含参数所指定的值

     *

     * @param mixed $obj 查找的值.

     * @return boolean True 如果存在于二叉排序树中则返回真,否则为假期

     */

    public function contains($obj) {

        if ($this->isEmpty())

            return false;

        $diff = $this->compare($obj);

        if ($diff == 0) {

            return true;

        }elseif ($diff < 0)             return $this->getLeft()->contains($obj);

        else

            return $this->getRight()->contains($obj);

    }

 

    /**

     * 查找二叉排序树中参数所指定的值的位置

     *

     * @param mixed $obj 查找的值.

     * @return boolean True 如果存在则返回包含此值的对象,否则为NULL

     */

    public function find($obj) {

        if ($this->isEmpty())

            return NULL;

        $diff = $this->compare($obj);

        if ($diff == 0)

            return $this->getKey();

        elseif ($diff < 0)             return $this->getLeft()->find($obj);

        else

            return $this->getRight()->find($obj);

    }

 

    /**

     * 返回二叉排序树中的最小值

     * @return mixed 如果存在则返回最小值,否则返回NULL

     */

    public function findMin() {

        if ($this->isEmpty ())

            return NULL;

        elseif ($this->getLeft()->isEmpty())

            return $this->getKey();

        else

            return $this->getLeft()->findMin();

    }

 

    /**

     * 返回二叉排序树中的最大值

     * @return mixed 如果存在则返回最大值,否则返回NULL

     */

    public function findMax() {

        if ($this->isEmpty ())

            return NULL;

        elseif ($this->getRight()->isEmpty())

            return $this->getKey();

        else

            return $this->getRight()->findMax();

    }

 

    /**

     * 给二叉排序树插入指定值

     *

     * @param mixed $obj 需要插入的值.

     * 如果指定的值在树中存在,则返回错误

     */

    public function insert($obj) {

        if ($this->isEmpty()) {

            $this->attachKey($obj);

        } else {

            $diff = $this->compare($obj);

            if ($diff == 0)

                die('argu error');

            if ($diff < 0)                 $this->getLeft()->insert($obj);

            else

                $this->getRight()->insert($obj);

        }

        $this->balance();

    }

 

 /**

     * 从二叉排序树中删除指定的值

     *

     * @param mixed $obj 需要删除的值.

     */

    public function delete($obj) {

        if ($this->isEmpty ())

            die();

 

        $diff = $this->compare($obj);

        if ($diff == 0) {

            if (!$this->getLeft()->isEmpty()) {

                $max = $this->getLeft()->findMax();

                $this->key = $max;

                $this->getLeft()->delete($max);

            }

            elseif (!$this->getRight()->isEmpty()) {

                $min = $this->getRight()->findMin();

                $this->key = $min;

                $this->getRight()->delete($min);

            } else

                $this->detachKey();

        } else if ($diff < 0)                 $this->getLeft()->delete($obj);

            else

                $this->getRight()->delete($obj);

        $this->balance();

    }

 

    public function compare($obj) {

        return $obj - $this->getKey();

    }

 

    /**

     * Attaches the specified object as the key of this node.

     * The node must be initially empty.

     *

     * @param object IObject $obj The key to attach.

     * @exception IllegalOperationException If this node is not empty.

     */

    public function attachKey($obj) {

        if (!$this->isEmpty())

            return false;

        $this->key = $obj;

        $this->left = new BST();

        $this->right = new BST();

    }

 

    /**

     * Balances this node.

     * Does nothing in this class.

     */

    protected function balance () {}

 

    /**

     * Main program.

     *

     * @param array $args Command-line arguments.

     * @return integer Zero on success; non-zero on failure.

     */

    public static function main($args) {

        printf("BinarySearchTree main program.\n");

        $root = new BST();

        foreach ($args as $row) {

            $root->insert($row);

        }

        return $root;

    }

}

 

$root = BST::main(array(50, 3, 10, 5, 100, 56, 78));

echo $root->findMax();

$root->delete(100);

echo $root->findMax();

php 如何做排列组合

原理相当于自己建个树,不停地在末尾里添加上子节点,最后遍历整个树。

代码如下:

<?php

$str='1=12,2=34,3=14,4=23';

$_str=explode(',',$str);

$_str=array_reverse($_str);

$_key=array();

$tree=array();

foreach($_str as $v){

$str=explode('=',$v);

$_key[]=$str[0];

$str=str_split($str[1]);

$_tree=array();

foreach($str as $node){

if(empty($tree)):

$_tree[][]=$node;

else:

foreach($tree as $_node) $_tree[]=str_split(implode($_node).$node);

endif;

}

$tree=$_tree;

}

foreach($tree as $v){

$str=array();

foreach($v as $_k=>$_v) $str[]=$_key[$_k].'='.$_v;

echo implode(',',array_reverse($str)),'<br>';

}

?>

PHP快速排序算法实现的原理及代码详解

算法原理

下列动图来自五分钟学算法,演示了快速排序算法的原理和步骤。

步骤:

从数组中选个基准值

将数组中大于基准值的放同一边、小于基准值的放另一边,基准值位于中间位置

递归的对分列两边的数组再排序

代码实现

function

quickSort($arr)

{

$len

=

count($arr);

if

($len

<=

1)

{

return

$arr;

}

$v

=

$arr[0];

$low

=

$up

=

array();

for

($i

=

1;

$i

<

$len;

++$i)

{

if

($arr[$i]

>

$v)

{

$up[]

=

$arr[$i];

}

else

{

$low[]

=

$arr[$i];

}

}

$low

=

quickSort($low);

$up

=

quickSort($up);

return

array_merge($low,

array($v),

$up);

}

测试代码:

$startTime

=

microtime(1);

$arr

=

range(1,

10);

shuffle($arr);

echo

"before

sort:

",

implode(',

',

$arr),

"\n";

$sortArr

=

quickSort($arr);

echo

"after

sort:

",

implode(',

',

$sortArr),

"\n";

echo

"use

time:

",

microtime(1)

-

$startTime,

"s\n";

测试结果:

before

sort:

1,

7,

10,

9,

6,

3,

2,

5,

4,

8

after

sort:

1,

2,

3,

4,

5,

6,

7,

8,

9,

10

use

time:

0.0009009838104248s

时间复杂度

快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。

这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。

1)

为什么最少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。

2)

为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。

您可能感兴趣的文章:PHP快速排序算法实例分析PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】PHP排序算法之快速排序(Quick

Sort)及其优化算法详解PHP递归实现快速排序的方法示例php

二维数组快速排序算法的实现代码PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort实例详解

关于php排序遍历树的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php排序遍历树 php实现排序算法的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did211134
更新时间:2023-05-03   阅读:17次

上一篇: php类变量开销 php变量有哪些基本数据类型

下一篇:ajax多个php文件 ajax与php交互

最新资料更新

  • 1.php获取服务器环境 php获取服务器状态
  • 2.php图书管理系统 php图书管理系统全部代码
  • 3.php批量取中间 php批量删除数据
  • 4.php登录网站 php网页登录
  • 5.php可以回收吗 php还有人用吗
  • 6.php数据层设计 php数据库操作
  • 7.php的环境安装 phpstudy安装环境
  • 8.php数据分数排序 php实现积分排行榜
  • 9.phpurl链接解析 php解析url
  • 10.phpword读写 php读写word 文档
  • 11.整站系统php源码 php企业网站整站源码
  • 12.web安全php Web安全原理分析与实践
  • 13.影视php解析api php解析vip视频
  • 14.郑州php业余培训 郑州php业余培训机构
  • 15.原生php提交form php原生开发的好处
  • 16.php资源扫描教程 php识别二维码内容源码
  • 17.php上传图片木马 php图片上传代码
  • 18.phpml源码安装 下载了个php源码包,怎么使用
  • 19.php项目任务分配 php任务调度框架
  • 20.php导出cvs php导出csv大数据

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]