• 写二叉树交换,结果写成N叉树随意交换


    闲着无聊花了两个多小时才写好

    交换前:

      1
     2       3
     10    4    5
               6 11 13
             7 12
           8 9

    交换后:

       1
       3      2
       5   4   10
              13 11 6
            12 7
           9  8

    <?
    $tree=array(
        array(0,1),
        array(1,2),
        array(1,3),
        array(3,4),
        array(3,5),
        array(5,6),
        array(6,7),
        array(7,8),
        array(7,9),
        array(2,10),
        array(5,11),
        array(6,12),
        array(5,13)
    );
    $alllink=array();
    $x=getLink();
    echo "交换前.....
    ";
    formatOutput($x);
    swapNode((parseLink($x)));
    $x=getLink();
    echo "交换后...
    ";
    formatOutput($x);
    function formatOutput($arr){
        foreach($arr as $v){
            echo $v."
    ";
        }
    }
    function swapNode($arr){
        global $tree;
        $ntree=$tree;
        for($i=0;$i<$arr[0];$i++){
            $swap=array();
            foreach($arr[1] as $v){
                if(isset($v[$i])){
                    if(!in_array($v[$i],$swap))$swap[]=$v[$i];
                }
            }
            if(count($swap)<2) continue;
            $rswap=array_reverse($swap);//反转,以便交换时一一对应
            for($j=0;$j<count($swap);$j++){
                foreach($tree as $k1=>$v1){
                    if($v1[1]==$swap[$j]){
                        $ntree[$k1]=array($ntree[$k1][0],$rswap[$j]);//当前节点交换,存储在新树中
                        foreach($tree as $k2=>$v2){
                            if($v2[0]==$swap[$j]){
                                $ntree[$k2]=array($rswap[$j],$ntree[$k2][1]);//子节点交换,存储在新树中
                            }
                        }
                    }
                }
            }
        }
        $tree=$ntree;
    }
    function parseLink($arr){
        $r=array();
        $maxLen=0;
        foreach($arr as $v){
            $t=explode("#",$v);
            if(count($t)>$maxLen)$maxLen=count($t);
            $r[]=explode("#",$v);
        }
        return array($maxLen,$r);
    }
    function getLink($pid=0){
        global $tree;
        $link=array();
        foreach($tree as $k=>$v){
            if($pid==$v[0]){
                $cid=getLink($v[1]);
                if(count($cid)>0){
                    foreach($cid as $v1){
                        $link[]=$v[1]."#".$v1;
                    }
                }else{
                    $link[]=$v[1];
                }
            }
        }
        return $link;
    }
    ?>

    交换前.....
    1#2#10
    1#3#4
    1#3#5#6#7#8
    1#3#5#6#7#9
    1#3#5#6#12
    1#3#5#11
    1#3#5#13
    交换后...
    1#3#5
    1#2#4
    1#2#10#13#12#9
    1#2#10#13#12#8
    1#2#10#13#7
    1#2#10#11
    1#2#10#6

  • 相关阅读:
    转(一万小时定律的文章): const 与 readonly区别...
    项目中报错邮件方法
    Windows Phone(一) 正式开发之前的准备资料(主要注册开发者账号,手机解锁,激活码,程序部署)
    转(ASP.NET页面缓存)
    部署XAP时,部署工具提示部署无效,求解决!
    jQuery 1
    DOMform
    jQuery 2 一些常用的函数
    jQuery 6 层次选择器
    jQuery 3 对象转换
  • 原文地址:https://www.cnblogs.com/boodoog/p/6072575.html
Copyright © 2020-2023  润新知