PHP实现二叉树的链式和数组存储结构

PHP数组实现二叉树的数据结构


class treearray
{
    private $size;
    private $p_array;

    public function __construct($size,$n_root)
    {
        $this->size=$size;
//       初始化根节点
        $this->p_array[0]=$n_root;
//       其他节点初始化为0
        for ($i=1;$i<$size;$i++){
            $this->p_array[$i]=0;
        }
    }

//   添加节点
//   搜索节点
//   变了节点
//   删除节点
    /**
     * add
     */

    /**
     * check 检查节点是否合法
     * @param $index
     * @return bool
     */
    private function check($index){

        if($index<0||$index>$this->size){
            return false;
        }
//        if($this->p_array[$index]==0){
//            return false;
//        }
        return  true;
    }

    /**
     * add
     * @param $index
     * @param $type 0 左节点 1 右节点
     * @param $data
     * @return bool
     */
    public function add($index,$type,$data){
        $flag=$this->check($index);
//        var_dump($index);
//        var_dump($flag);
        if(!$flag){
            return $flag;
        }
        if($type==0){
            $index=$index*2+1;
            $flag=$this->check($index);
            if(!$flag){
                return $flag;
            }
            $this->p_array[$index]=$data;

        }
        if($type==1){
            $index=$index*2+2;
            $flag=$this->check($index);
            if(!$flag){
                return $flag;
            }
            $this->p_array[$index]=$data;

        }
        return true;

    }


    /**
     * search
     * @param $index
     * @return bool
     */
    public function search($index){
        $flag=$this->check($index);
        if(!$flag){
            return $flag;
        }
        return $this->p_array[$index];
    }

    /**
     * del
     * @param $index
     * @return bool
     * @author:xu.weishuai
     * @Time:2019/10/29 11:19
     */
    public function del($index){
        $flag=$this->check($index);
        if(!$flag){
            return $flag;
        }
        $this->p_array[$index]=0;
        return true;

    }
    public function all(){
        return $this->p_array;
    }


}
/*
 *              8(0)
 *       7(1)         9(2)
 *     5(3) 6(4)   1(5)  2(6)
 *
 * */

$tree=new treearray(10,8);

$flag=$tree->add(0,0,7);
$tree->add(0,1,9);
$tree->add(1,0,5);
$tree->add(1,1,6);
$tree->add(2,0,1);
$tree->add(2,1,2);

$all=$tree->all();
print_r($all);
$node5=$tree->search(5);
print_r($node5);

PHP类实现二叉树的链式存储结构

/*
 *              8(0)
 *       7(1)         9(2)
 *     5(3) 6(4)   1(5)  2(6)
 *
 * */
/*
 * 类 node
 * 属性 pre  leftNode rightNode index data
 * 类 tree
 * 属性  size  r_root
 *
 * */

class node{
//    public $pre;
    public $leftNode;
    public $rightNode;
    public $index;
    public $data;
    public function __construct($data,$index=0,$pre=null,$leftNode=null,$rightNode=null)
    {

        $this->data=$data;
        $this->index=$index;

    }
//   筛选节点
    public function search($index){

        if($this->index==$index){
            return $this;
        }


        if($this->leftNode!=null){
            if($this->leftNode->index==$index){
                return $this->leftNode;
            }
            $temp=$this->leftNode->search($index);
//           ---------------需要判断一下否则直接返回 会报错-----------------------------
            if($temp!=null){
                return $temp;
            }

        }
        if($this->rightNode!=null){
            if($this->rightNode->index==$index){
                return $this->rightNode;
            }
            $temp= $this->rightNode->search($index);
            //           ---------------需要判断一下否则直接返回 会报错-----------------------------
            if($temp!=null){
                return $temp;
            }

        }
        return null;

    }

    /**
     * preTraverse 前序遍历
     * @author:xu.weishuai
     * @Time:2019/10/30 18:33
     */
    public function preTraverse(){
        if($this->leftNode!=null){
//            echo $this->leftNode->data;
            $this->leftNode->preTraverse();

        }
        echo $this->data;
        if($this->rightNode!=null){
//            echo $this->rightNode->data;
            $this->rightNode->preTraverse();
        }
    }
    public function inTraverse(){
        echo $this->data;
        if($this->leftNode!=null){

            $this->leftNode->inTraverse();

        }

        if($this->rightNode!=null){

            $this->rightNode->inTraverse();
        }
    }
    public function afterTraverse(){

        if($this->leftNode!=null){

            $this->leftNode->afterTraverse();

        }

        if($this->rightNode!=null){

            $this->rightNode->afterTraverse();
        }
        echo $this->data;
    }



}
class Tree{
    public $r_root;
    public function __construct($node)
    {
        $this->r_root=$node;
    }
//  添加 筛选节点

    public function search($index){

        return $this->r_root->search($index);
    }
    public function add($index,$type,$data){
        $indexNode=$this->r_root->search($index);

        if(!$indexNode){
            return false;
        }
        if($type==0){
            $index=2*$indexNode->index+1;

            $node=new node($data,$index);
            $indexNode->leftNode=$node;
            return true;
        }
        if($type==1){
            $index=2*$indexNode->index+2;
            $node=new node($data,$index);
            $indexNode->rightNode=$node;
            return true;
        }

        return false;


    }
//   树遍历 前序 中序 后续
    public function preTraverse(){
        $this->r_root->preTraverse();
    }
    public function inTraverse(){
        $this->r_root->inTraverse();
    }
    public function afterTraverse(){
        $this->r_root->afterTraverse();
    }

}

$root_node=new node(8);
$tree=new Tree($root_node);

var_dump($tree->search(0)->data);
/*
 *              8(0)
 *       7(1)         9(2)
 *     5(3) 6(4)   1(5)  2(6)
 *
 * */
$tree->add(0,0,7);
$tree->add(0,1,9);
$tree->add(1,0,5);
$tree->add(1,1,6);
$tree->add(2,1,2);
$tree->add(2,0,1);

//var_dump($tree->search(1)->leftNode);
var_dump($tree->search(4)->data);
//var_dump($tree->search(2)->leftNode);
//var_dump($tree->search(5));
//var_dump($tree);
//$tree->search(5) ;
$tree->preTraverse();
echo "\n";
$tree->inTraverse();
echo "\n";
$tree->afterTraverse();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值