多叉树最短路径

<?php
$arr =array('A'=>array('value'=>1,'child_list'=>array('B','C','D')),
'B'=>array('value'=>1,'child_list'=>array('E','F','G')),
'F'=>array('value'=>1,'child_list'=>array('K','L','N')),
'N'=>array('value'=>1,'child_list'=>array('R','S','T')),
'D'=>array('value'=>1,'child_list'=>array('H','I','J')),
'H'=>array('value'=>1,'child_list'=>array('O','P','Q')),
'C'=>array('value'=>1,'child_list'=>array()),
'E'=>array('value'=>1,'child_list'=>array()),
'K'=>array('value'=>1,'child_list'=>array()),
'L'=>array('value'=>1,'child_list'=>array()),
'G'=>array('value'=>1,'child_list'=>array()),
'R'=>array('value'=>1,'child_list'=>array()),
'S'=>array('value'=>1,'child_list'=>array()),
'T'=>array('value'=>1,'child_list'=>array()),
'I'=>array('value'=>1,'child_list'=>array()),
'J'=>array('value'=>1,'child_list'=>array()),
'O'=>array('value'=>1,'child_list'=>array()),
'P'=>array('value'=>1,'child_list'=>array()),
'Q'=>array('value'=>1,'child_list'=>array()),
);

function find_path($nodeA,$nodeB){
	global $arr;
	$rootA = find_root($nodeA);
	$rootB = find_root($nodeB);
	if(!$rootA) $rootA[]=$nodeA;
	else $outA[] = $nodeA;
	if(!$rootB) $rootB[]=$nodeB;
	else $outB[] = $nodeB;
	foreach($rootA as $v){
		$outA[] = $v;
		if(in_array($v,$rootB)){
			foreach($rootB as $va){
				if($va == $v) break;
				else $outB[] =$va;
			}
			if($outB) $outB = array_reverse($outB);
			break;
		}
	}
	if($outA) echo implode('=>',$outA);
	if($outB) echo '=>'.implode('=>',$outB);
}

function find_root($node,$root=array()){
	global $arr;
	foreach($arr as $k=>$v){
		if(in_array($node,$v['child_list'])){
			$root[]=$k;
			return find_root($k,$root);
		}
	}
	return $root;
}
find_path('G','R');
?>

输出 G=>B=>F=>N=>R

转载于:https://my.oschina.net/jiuxiaoyao/blog/837562

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值