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);
    

      

  • 相关阅读:
    Mac终端学习C笔记
    苹果双系统win8.1遇到的一些问题
    初学者Android studio安装
    java八种排序算法---直接插入排序
    java八种排序算法---快速排序
    java的八种排序算法---冒泡排序
    转利用 NPOI 變更字體尺寸及樣式
    AJAX 跨域调用WEB API(转)
    常用C#字符串函数大全
    C# 发送邮件整理,包括控制台程序、WPF、WebForm 及 ASP.NET MVC
  • 原文地址:https://www.cnblogs.com/taijun/p/5066931.html
Copyright © 2011-2022 走看看