欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构-二叉树

程序员文章站 2022-03-14 22:52:39
...

二叉树的生成及前序、中序和后序遍历


数据结构-二叉树

<?php
    /**
     * 节点
     */
    class Node
    {
        public $node;//节点
        public $leftChild;//左孩子
        public $rightChild;//右孩子
        public function __construct($node)
        {
            $this->node = $node;
            $this->leftChild = '';
            $this->rightChild = '';//默认是空
        }
    }

    /**
    * 二叉树
    */
    class Btree 
    {
        public $root = '';//子树,在此基础上扩展二叉树

        static function index()
        {
            echo '';
        }

        /**
         * [insertNode 插入节点]
         * @param  [type] $child [需要插入的数据元素,还不是节点]
         * @return [type]        [description]
         */
        public function insertNode($child)
        {
            $newNode = new Node($child);//转换成子树
            if ($this->root == null) {//如果没有子树,把第一个子树赋值给根子树
                $this->root = $newNode;
            }else{
                $this->getInsertTree($this->root,$newNode);
            }

        }

        /**
         * [getInsertTree 遍历插入,形成二叉树,(已存在根节点)]
         * @param  [type] $parent  [根子树]
         * @param  [type] $child [新插入的子树,如果新子树的节点小于根子树的节点,则和根子树的左孩子比较,如果大于则和根子树的右孩子比较]
         * @return [type]        [description]
         */
        public function getInsertTree($parent,$child)
        {

            if (isset($child->node) && isset($parent->node)) {
                if ($child->node<$parent->node) {//如果节点小于根节点,看根节点的左孩子是否存在

                    if ($parent->leftChild == null) {//如果左孩子不存在

                        $parent->leftChild = $child;

                    }else{

                        $this->getInsertTree($parent->leftChild,$child);
                    }
                }else{
                    //如果大于等于根节点
                    if ($parent->rightChild == null) {//如果没有右孩子,把新节点放到右边
                        $parent->rightChild = $child;

                    }else{

                        $this->getInsertTree($parent->rightChild,$child);
                    }
                }
            }


        }

        /**
         * [getPreorder 前序遍历,根->左->右]
         * @param  [type] $tree [一棵树]
         * @return [type]       [description]
         */
        public function getPreorder($tree)
        {
            // print_r($tree);exit;//需要遍历的树
            if (isset($tree->node)) {//如果树存在
                echo $tree->node,'--';
                if(isset($tree->leftChild))//如果左孩子存在
                {
                    $this->getPreorder($tree->leftChild);
                }

                if(isset($tree->rightChild))//如果右孩子存在
                {
                    $this->getPreorder($tree->rightChild);
                }
            }

        }

        /**
         * [getMiddelorder 中序遍历,左->根->右,首先要遍历二叉树的左子树,接着遍历根节点,最后遍历右子树。如果子节点下边还有子节点也是按照左根右的顺序]
         * @param  [type] $tree [一棵树]
         * @return [type]       [description]
         */
        public function getMiddelorder($tree)
        {
            if (isset($tree->node)) {
                if (isset($tree->leftChild)) {//如果有左孩子则遍历
                    $this->getMiddelorder($tree->leftChild);
                }
                echo $tree->node,'--';
                if (isset($tree->rightChild)) {//如果有右孩子则遍历
                    $this->getMiddelorder($tree->rightChild);
                }
            }
        }

        /**
         * [getPostorder 后序遍历,左->右->根,首先按照后序遍历的规则遍历左子树,接着按照后序遍历的规则遍历右子树,最后访问根节点。]
         * @param  [type] $tree [description]
         * @return [type]       [description]
         */
        public function getPostorder($tree)
        {
            if (isset($tree->node)) {
                if (isset($tree->leftChild)) {
                    $this->getPostorder($tree->leftChild);
                }
                if (isset($tree->rightChild)) {
                    $this->getPostorder($tree->rightChild);
                }
                echo $tree->node,'--';
            }


        }
    }

    $nodes = [34,2,111,43,12,32,234,42,321,24,24,53];
    $bTree = new Btree();//实例化对象
    foreach ($nodes as $node) {//循环调用插入方法
        $bTree->insertNode($node);//$node为数组中的元素
    }

    //前序遍历,根->左->右
    $bTree->getPreorder($bTree->root);//34--2--12--32--24--24--111--43--42--53--234--321--
    echo "<br>";
    //中序遍历,左->根->右
    $bTree->getMiddelorder($bTree->root);//2--12--24--24--32--34--42--43--53--111--234--321--
    echo "<br>";
    //后序遍历
    $bTree->getPostorder($bTree->root);//24--24--32--12--2--42--53--43--321--234--111--34--

    ?>
相关标签: 二叉树