PHP树-不需要递归

/**
 * 创建父节点树形数组
 * 参数
 * $ar 数组,邻接列表方式组织的数据
 * $id 数组中作为主键的下标或关联键名
 * $pid 数组中作为父键的下标或关联键名
 * 返回 多维数组
 **/
function find_parent($ar, $id=‘id‘, $pid=‘pid‘) {
  foreach($ar as $v) $t[$v[$id]] = $v;
  foreach ($t as $k => $item){
    if( $item[$pid] ){
      if( ! isset($t[$item[$pid]][‘parent‘][$item[$pid]]) )
         $t[$item[$id]][‘parent‘][$item[$pid]] =& $t[$item[$pid]];
    }
  }
  return $t;
}

/**
 * 创建子节点树形数组
 * 参数
 * $ar 数组,邻接列表方式组织的数据
 * $id 数组中作为主键的下标或关联键名
 * $pid 数组中作为父键的下标或关联键名
 * 返回 多维数组
 **/
function find_child($ar, $id=‘id‘, $pid=‘pid‘) {
  foreach($ar as $v) $t[$v[$id]] = $v;
  foreach ($t as $k => $item){
    if( $item[$pid] ) {
      $t[$item[$pid]][‘child‘][$item[$id]] =& $t[$k];
    }
  }
  return $t;
}

    $data = array(
      array(‘ID‘=>1, ‘PARENT‘=>0, ‘NAME‘=>‘祖父‘),
      array(‘ID‘=>2, ‘PARENT‘=>1, ‘NAME‘=>‘父亲‘),
      array(‘ID‘=>3, ‘PARENT‘=>1, ‘NAME‘=>‘叔伯‘),
      array(‘ID‘=>4, ‘PARENT‘=>2, ‘NAME‘=>‘自己‘),
      array(‘ID‘=>5, ‘PARENT‘=>4, ‘NAME‘=>‘儿子‘),
    );

    $p = find_parent($data, ‘ID‘, ‘PARENT‘);
    $c = find_child($data, ‘ID‘, ‘PARENT‘);
    Print_r ($c);

执行效果:



Array
(
    [1] => Array
        (
            [ID] => 1
            [PARENT] => 0
            [NAME] => 祖父
            [child] => Array
                (
                    [2] => Array
                        (
                            [ID] => 2
                            [PARENT] => 1
                            [NAME] => 父亲
                            [child] => Array
                                (
                                    [4] => Array
                                        (
                                            [ID] => 4
                                            [PARENT] => 2
                                            [NAME] => 自己
                                            [child] => Array
                                                (
                                                    [5] => Array
                                                        (
                                                            [ID] => 5
                                                            [PARENT] => 4
                                                            [NAME] => 儿子
                                                        )

                                                )

                                        )

                                )

                        )

                    [3] => Array
                        (
                            [ID] => 3
                            [PARENT] => 1
                            [NAME] => 叔伯
                        )

                )

        )

    [2] => Array
        (
            [ID] => 2
            [PARENT] => 1
            [NAME] => 父亲
            [child] => Array
                (
                    [4] => Array
                        (
                            [ID] => 4
                            [PARENT] => 2
                            [NAME] => 自己
                            [child] => Array
                                (
                                    [5] => Array
                                        (
                                            [ID] => 5
                                            [PARENT] => 4
                                            [NAME] => 儿子
                                        )

                                )

                        )

                )

        )

    [3] => Array
        (
            [ID] => 3
            [PARENT] => 1
            [NAME] => 叔伯
        )

    [4] => Array
        (
            [ID] => 4
            [PARENT] => 2
            [NAME] => 自己
            [child] => Array
                (
                    [5] => Array
                        (
                            [ID] => 5
                            [PARENT] => 4
                            [NAME] => 儿子
                        )

                )

        )

    [5] => Array
        (
            [ID] => 5
            [PARENT] => 4
            [NAME] => 儿子
        )

)
时间: 2024-12-30 03:38:17

PHP树-不需要递归的相关文章

Best Coder Round#25 1003 树的非递归访问

虽然官方解释是这题目里的树看作无向无环图,从答案来看还是在“以1作为根节点”这一前提下进行的,这棵树搭建好以后,从叶节点开始访问,一直推到根节点即可——很像动态规划的“自底向上”. 但这棵树的搭建堪忧:给出的边不知道哪边更接近根节点.所以我给出的方案干脆在两个顶点都将对方加成孩子,等到访问的时候再作处理,根据从1这个根节点开始访问这个特性,额外加一个“isVisited"来做区分. 然后利用栈对树进行非递归访问 /** * For best-coder problem 3 */ #include

C# TreeView 树节点:递归显示整个系统盘符文件目录及文件

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace Demo { /// <summary> /// 有关对于TreeView节点的填充的相关处理类 /// </summary> class TreeViewUtils { #region 有关将整个系统盘

树的非递归遍历——前序、中序、后序

树的递归遍历非常简单,也是写树的遍历时最常用的写法.但是我发现自己对树的非递归遍历并不十分熟悉,所以把三种非递归遍历都写了一遍,以后看到这篇记录博客也可以帮助自己好好回想熟悉一下. Leetcode对应习题:前序,中序,后序. 相对而言,这三种非递归遍历的难度--前序 < 中序 < 后序. 对于第三种(非递归后序遍历)方法,只要稍微调整下第18~19行三个节点push的顺序,就可以实现前中后序的遍历. 树的非递归前序: 1 class Solution { 2 public: 3 vector

树的非递归遍历

树是递归定义的,利用递归算法遍历树实现起来比较简单,然而难的是非递归遍历.非递归遍历需要借助栈这一数据结构来完成. 首先定义树的结点和构建链表栈: //定义树的节点 typedef struct Node { int data; struct Node* lchild; struct Node* rchild; }Node; //定义栈节点 typedef struct Stacknode { Node* tnode; struct Stacknode* next; }Stacknode;  /

树的非递归遍历(中序遍历)

中序 遍历的几种情况 分析1:什么时候访问根.什么时候访问左子树.什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树. 分析2:非递归遍历树,访问结点时,为什么是栈,而不是其他模型(比如说是队列). 先走到的后访问.后走到的先访问,显然是栈结构 分析3:结点所有路径情况 步骤1: 如果结点有左子树,该结点入栈: 如果结点没有左子树,访问该结点: 步骤2: 如果结点有右子树,重复步骤1: 如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素

oracle 树状结构递归 PL/SQL输出控制 包括空格输出控制

树状结构 存储过程中通过递归构建,类似BBS回帖显示,代码共三段: 建表,插入数据,创建存储过程显示: 1.create table article(id number primary key,cont varchar2(4000),pid number,idleaf number(1), --0为非叶子节点,1为叶子节点alevel number(2)); 2. insert into article values(1,'蚂蚁大战大象',0,0,0);insert into article v

根据前序序列和中序序列,重建一颗树(PHP递归实现)

class TreeNode{ public $data; public $lchild = null; public $rchild = null; public function __construct($data='',$lchild=null,$rchild=null){ $this->data = $data; $this->lchild = $lchild; $this->rchild = $rchild; } } //根据前序和中序,重建一颗树 //$pre 前序遍历的数组

java 树的遍历(递归与非递归)

package wangChaoPA实习工作练习.com.leetcode;import java.util.ArrayList;import java.util.Stack;class TreeNode{    TreeNode left;    TreeNode right;    int val; TreeNode(int x)    {        val = x;    }}public class TreeTrivel{    // 测试    public static void

线段树的基础递归的使用

问题描述 给定n个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b]的连续和.数列的元素个数最多100000个,询问操作最多100000次. 输入 第一行2个整数n,m(n表示输入n个数列,m表示有m个操作)第二行输入n个数列. 接下来M行,每行有三个数k,a,b(k=0表示求子数列[a,b]的和,k=1表示第a个数列加b) 输出 输出若干行数字,表示每次K=0时对应输出一个子数列[a,b]的连续和. 输入样列 10 5 1 2 3 4 5 6 7 8 9 10 1 1 5 0 1

树型结构递归 实体递归 JSON格式

用递归实现无限级菜单,产品分类,盖楼式评论.留言等功能. 下列代码不能直接使用 CREATE TABLE [dbo].[P_Category]( [Code] [varchar](36) NOT NULL PRIMARY KEY, [Parent_Code] [varchar](36) NULL, [Depth] [int] NULL, [Name] [varchar](50) NULL ) GO INSERT [dbo].[P_Category] ([Code], [Parent_Code],