美文网首页PHP数据结构
PHP二叉树之构建二叉树

PHP二叉树之构建二叉树

作者: 江月照我眠 | 来源:发表于2021-12-09 17:21 被阅读0次

    每次刷力扣题,做到链表、二叉树等题目的时候,我就开始发现我无从下手了,我甚至连答案都看不懂!后来我才明白,二叉树是需要自己去构建的。我好菜,我哭死~~

    一、准备节点类

    很简单,val为当前节点的值,left为左子节点,right为右子节点

    /**
     * 节点类
     */
    class TreeNode 
    {
        public $val = null;
        public $left = null;
        public $right = null;
        function __construct($val = 0, $left = null, $right = null) {
            $this->val = $val;
            $this->left = $left;
            $this->right = $right;
        }
    } 
    

    二、构建二叉树

    /**
     * 二叉树
     */
    class BinaryTree
    {
        public $root;
        public $queue;
        public $index = 0;
    
        public function __construct(array $data)
        {
            $this->createTree($data);
        }
    
        public function createTree($arr) 
        {
            if (empty($arr)) {
                return null;
            }
    
            // 先加入根节点,不管它的左右子节点
            $this->root = new TreeNode($arr[$this->index]);
            // 利用队列来实现,每次处理完父节点,将父节点出列,然后依次压入左、右子节点
            // 然后利用队列可迭代的特性,按照先入先出的特点,循环处理剩余子节点
            $this->queue = new SplQueue;
            $this->queue->enqueue($this->root);
    
            $len = count($arr);
            while ($this->queue->count() > 0) {
                $cur = $this->queue->dequeue();
                // 左节点
                $this->index++;
                if ($this->index >= $len) {
                    $this->index--; // 最大index恢复正常
                    break;
                };
                if ($arr[$this->index] !== null) {
                    $cur->left = new TreeNode($arr[$this->index]);
                    $this->queue->enqueue($cur->left);
                }
    
                // 右节点
                $this->index++;
                if ($this->index >= $len) {
                    $this->index--; // 最大index恢复正常
                    break;
                };
                if ($arr[$this->index] !== null) {
                    $cur->right = new TreeNode($arr[$this->index]);
                    $this->queue->enqueue($cur->right);
                }
            }
    
            return $this->root;
        }
    }
    
    // 用法
    $tree = new BinaryTree([1,null,2,3]);
    print_r($tree->root);
    

    这样,做二叉树前中后序遍历等题目时,将$tree->root作为入参即可顺利测试啦~

    相关文章

      网友评论

        本文标题:PHP二叉树之构建二叉树

        本文链接:https://www.haomeiwen.com/subject/akiffrtx.html