zoukankan      html  css  js  c++  java
  • 取子树算法

    <?php
    /**
     *
     * 查找一棵树的子树
     * @var unknown_type
     * @author tianquanjun
     *
     */
    
    class demo{
    	
    	public $tree;
    	
    	//初始化一棵树
    	public function __construct($tree){
    		$this->tree = $tree;
    	}
    
    	//遍历树中的每一个节点,看其是否为指点节点的子树节点
    	public function handle($id){
    		$data = array();
    		foreach ($this->tree as $item){
    			$res = $this->is_son_node($id,$item);
    			//在字树中,保留
    			if($res){
    				$data[] = $item;
    			}
    		}
    		return $data;
    	}
    
    	//判断节点是否是指定id的子树节点
    	private function is_son_node($id,$node){
    		//节点本身是根节点,不是任何节点的子节点
    		if(empty($node['pid'])){
    			return false;
    		}
    		//节点的父id恰好是指定的节点,是其儿子节点
    		if($node['pid'] == $id){
    			return true;
    		}else{
    			//节点的父节点不是指定节点,向上遍历,看齐祖辈节点是否是指定节点,递归判断
    			$parent = $this->get_parent_node($node['pid']);
    			return $this->is_son_node($id, $parent);
    		}
    
    	}
    	
    	//根据id获取父节点完整信息
    	private function get_parent_node($id){
    		foreach ($this->tree as $val){
    			if($val['id'] == $id){
    				return $val;
    			}
    		}
    	}
    }
    
    
    //构造一棵树,数组表示.id表示节点本身编号,pid表示父节点的编号
    $tree = array(
    	array('id'=>1,'pid'=>'','name'=>'a'),//root
    	array('id'=>2,'pid'=>'1','name'=>'b'),
    	array('id'=>3,'pid'=>'1','name'=>'c'),
    	array('id'=>4,'pid'=>'1','name'=>'d'),
    	array('id'=>5,'pid'=>'2','name'=>'e'),
    	array('id'=>6,'pid'=>'2','name'=>'f'),
    	array('id'=>7,'pid'=>'3','name'=>'g'),
    	array('id'=>8,'pid'=>'4','name'=>'h'),
    	array('id'=>9,'pid'=>'7','name'=>'i'),
    	array('id'=>10,'pid'=>'7','name'=>'j'),
    	array('id'=>11,'pid'=>'8','name'=>'k'),
    );
    $id = 2;
    $obj = new demo($tree);
    $result = $obj->handle($id);
    echo "<pre/>";
    print_r($result);
    

      

  • 相关阅读:
    Microsoft Prerelease Software Visual Studio Code Name "Orcas" January 2007 Community Technology Preview (CTP)
    Attribute Example In MSDN
    AutoEventWireup 20032005
    转ASP.NET中常用的优化性能方法
    转 用whitespace:nowrap;解决中文标签标签换行问题
    RBAC 模型初探[转]
    .net开源相关
    Path.GetExtension 方法
    应用程序注释规范
    Web.config的写入操作
  • 原文地址:https://www.cnblogs.com/taijun/p/5066931.html
Copyright © 2011-2022 走看看